Catchable fatal error: Object of class variant could not be converted to string in ... on line 160
return $tab1.strtr($content, array('>'=>'>', '<'=>'<', ...));
$content 不是字串,而是一個物件(可能是 COM Variant 物件或自定類別實例)。PHP 5/7 中,strtr() 要求第一參數為字串,物件無法隱性轉換為字串,除非該類別實作 __toString() 魔術方法。
<?php
// 呼叫端
$content = (string)$content; // 強制轉型
// 或
$content = $content->getContent(); // 若物件有取值方法
// 函式內部防禦
function encode($content, $type='Element', $tab1='', $br='') {
if (is_object($content)) {
if (method_exists($content, '__toString')) {
$content = (string)$content;
} elseif (method_exists($content, 'getContent')) {
$content = $content->getContent();
} else {
throw new InvalidArgumentException('content must be string or stringable object');
}
}
// ... 後續邏輯
}
<?php
class MyContent {
private $data;
public function __construct($data) { $this->data = $data; }
public function __toString() { return $this->data; }
}
$obj = new MyContent('test ');
echo strtr($obj, ['<' => '<']); // 正常運作
若 $content 來自 com_dotnet 擴充(如讀取 Word/Excel),需取值:
$content = $variant->value; // 或 $variant->GetValue()
var_dump($content); // 確認型別
// 輸出範例:object(variant)#1 (0) { } 或 object(MyClass)#2 (1) { ["data"]=> string(10) "hello" }
strtr() 不接受物件參數。遇到此錯誤,請先 var_dump() 確認變數型別,再依來源決定「強制轉型」、「呼叫取值方法」或「實作 __toString()」。