由於最近在協助客戶將所有 PHP4 的網站全部升級至 PHP5,轉移的過程中遇到了一個 PHP Catchable fatal error 的錯誤訊息,訊息如下:
PHP Catchable fatal error: Object of class Cart could not be converted to string in C:\Inetpub\wwwroot\libs\functions.inc.php on line 118
我先開啟該檔案的 118 行查看出了什麼問題,但查不出任何異狀,只好開始往回 Stack Trace,查到了錯誤發生的地方:
<?php echo $val; ?>
而至於 $val 是我從資料庫的資料取出之後,透過 unserialize 過的物件,由於我有些欄位的值是儲存成物件序列化(Serialize)的結果 ( e.g. 購物車資訊 ),等要用時再直接反序列化來用。
由於之前的程式沒寫好,遇到這類程式也是直接輸出物件,但當時 PHP4 又沒有實做 __toString() 方法,所以導致當要將 object 轉換成 string 時才會發生這個嚴重錯誤(fatal error)。這個不相容的問題是發生在 PHP 5.2 之後的版本,詳細的資訊可參考 Backward Incompatible Changes 說明。
若要解決這個問題也很簡單,由於序列化(Serialize)所儲存的是「當時物件的資訊」,並不包含「類別」的定義,所以原本在資料庫中的資料並沒有異動的需要,只要你將原本物件定義的地方加上 __toString() 方法即可。例如:
function __toString()
{
return "";
}
好康報報
最近有個好康的消息要報給大家知道,微軟在這不景氣的時刻,竟然還推出一個 PHP 架站賺好康,千元購物金任你拿 活動,如果你的 PHP 網站目前是架設在 Linux 平台,只要成功轉移至 Windows 平台就可以獲得 NT$ 1,000.- 元的 Yahoo 購物金喔,如果本來要就要轉移網站的可以立即前往報名,只有 100 位名額喔。
至於轉移的參考依據都是以 NETCRAFT 的 The Netcraft Web Server Query Form 作為參考依據,各位可以到這裡查看看你網站在上面登記的是什麼 OS 與 Web Server,如下圖示,我前幾天才剛把我們公司的官網從 Linux 移至 Windows 平台,已經現賺 NT$ 1,000 了。 ^_^
相關連結