當我運行「Behat」步驟時,Behat error handler將「嘗試獲取非對象的屬性」錯誤轉爲異常。PHP轉「調用非對象的成員函數」爲例外
這非常有幫助,因爲它會導致該步驟被標記爲失敗,並允許測試運行在下一個場景中繼續。
但是,「調用非對象成員函數」錯誤是致命的,並立即停止測試執行(包括中止將結果寫入xml)。這是無益的。
我的問題是:
是什麼這兩個錯誤之間的區別?他們是不同的「錯誤級別」?記錄在哪裏?我已經搜索了PHP站點和Google,並且找不到規範的參考資料,只是有很多關於調試每個錯誤的特定實例的問題。
有什麼辦法可以將後面的錯誤轉換成異常,而不是完全停止腳本?在我看來,取消引用「
null
」和「->
」將是一個錯誤,「無法從諸如內存分配問題中恢復」。
更新:
看起來這僅僅是一個已知的問題用PHP。請參閱:
- #51882呼叫要對非對象成員函數應該拋出一個異常
- #46601 E_RECOVERABLE_ERROR爲「調用一個成員函數的非對象」
- #51848非對象方法調用錯誤應該是開捕帶的set_error_han dler()
- #63538「調用未定義功能」應該是開捕
了一些p-人們說這是「按設計」,但我認爲這只是在將對象添加到PHP之前定義的錯誤級別的人造物。用非OO語言調用一個不存在的函數是一個嚴重的錯誤,我可以看到它是如何被描述爲「致命的」或「不可恢復的」(儘管在非OO語言中可以定義函數即使這似乎過分悲觀)。現在,現在您可以在任何舊的$a
上執行「$a->f()
」,但「f
」可能不存在的可能性更大,並且它看起來應該不是致命錯誤(參見Java,其中這將是NullPointerException )。
我想,讓我到一個新的問題:
_ 3.你怎麼能修補PHP使「調用一個成員函數的非對象上」錯誤非致命性,而不會大規模破向後兼容,以及您可以採取哪些步驟來最大限度地將該補丁程序接受到PHP中?
更新2重新修補PHP:
有進行這種修復一些有限的支持on the PHP internals mailing list。現在我只需要編寫一個修補程序來解決這個問題並創建一個RFC。
謝謝;這解釋了差異背後的一些想法。你有沒有引用缺少的方法是1級,而缺失的屬性是8級,還是隻能通過實驗來確定? – Rich 2013-03-19 16:52:51