解決 The script tried to execute a method or access a property of an incomplete object
問題
程式執行出現以下錯誤
1 | Fatal error: main() [<a href='function.main'>function.main</a>]: The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition "MyClass" of the object you are trying to operate on was loaded _before_ unserialize() gets called or provide a __autoload() function to load the class definition in xxx.php on line 4 |
原因
這是因為程式某些操作產生 Incomplete Object(__PHP_Incomplete_Class),並且呼叫了此物件的函式。產生 Incomplete Object 的原因是序列化的資料轉回原始物件時,該物件的類別並未被定義,常見的情況如下:
利用 Session 存取自定義物件
例如定義一個類別
1 | class MyClass |
存入 Session
1 | include("c.php"); |
在別的程式取出實例
1 | session_start(); |
序列化與反序列化自定義物件
建立類別實例並序列化
1 | include("c.php"); |
在別的程式反序列化
1 | $c = unserialize('O:1:"MyClass":0:{}'); |
由於在 session_start()
和反序列化之前,自定義類別並未引用,造成此錯誤。
解決方案
需引用自定義類別並且在 session_start()
和反序列化動作之前。
1 | include("c.php"); |
1 | include("c.php"); |
並確保 php.ini 中的 session.auto_start 設定停用
1 | session.auto_start = 0 |
或透過 .htaccess 停用
1 | php_value session.auto_start 0 |
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 小殘的程式光廊!
Comment