﻿# 將 PHP4 升級時遇到 PHP Catchable fatal error 的問題

由於最近在協助客戶將所有 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](http://tw2.php.net/unserialize) 過的物件，由於我有些欄位的值是儲存成物件序列化([Serialize](http://tw2.php.net/serialize))的結果 ( e.g. 購物車資訊 )，等要用時再直接反序列化來用。

由於之前的程式沒寫好，遇到這類程式也是直接輸出物件，但當時 PHP4 又沒有實做 \_\_toString() 方法，所以導致當要將 object 轉換成 string 時才會發生這個嚴重錯誤(fatal error)。這個不相容的問題是發生在 PHP 5.2 之後的版本，詳細的資訊可參考 [Backward Incompatible Changes](https://web.archive.org/web/20120826145042/http://be.php.net:80/manual/en/migration52.incompatible.php) 說明。

若要解決這個問題也很簡單，由於序列化(Serialize)所儲存的是「當時物件的資訊」，並不包含「類別」的定義，所以原本在資料庫中的資料並沒有異動的需要，只要你將原本物件定義的地方加上 \_\_toString() 方法即可。例如：

```
function __toString()
{
    return "";
}
```

**好康報報**

最近有個好康的消息要報給大家知道，微軟在這不景氣的時刻，竟然還推出一個 [PHP 架站賺好康，千元購物金任你拿](https://partner.microsoft.com/taiwan/40099455) 活動，如果你的 PHP 網站目前是架設在 Linux 平台，只要成功轉移至 Windows 平台就可以獲得 NT$ 1,000.- 元的 Yahoo 購物金喔，如果本來要就要轉移網站的可以[立即前往報名](http://www.microsoft.com/taiwan/promo/php1000/default.htm)，只有 100 位名額喔。

至於轉移的參考依據都是以 [NETCRAFT](http://www.netcraft.com/) 的 [The Netcraft Web Server Query Form](https://sitereport.netcraft.com/) 作為參考依據，各位可以到這裡查看看你網站在上面登記的是什麼 OS 與 Web Server，如下圖示，我前幾天才剛把我們公司的官網從 Linux 移至 Windows 平台，已經現賺 NT$ 1,000 了。 ^\_^

 ![The Netcraft Web Server Query Form](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/a46d6c814f6b6f91ab09-image_6.png)

![The Netcraft Web Server Query Form : OS, Web Server and Hosting History for www.miniasp.com ](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/0970c7b96026db93001f-image_9.png)

**相關連結**

-   [Backward Incompatible Changes](https://web.archive.org/web/20120826145042/http://be.php.net:80/manual/en/migration52.incompatible.php)
-   [Magic Methods: \_\_toString()](http://tw2.php.net/manual/en/language.oop5.magic.php#language.oop5.magic.tostring)
