請看下邊一段代碼斑响,以大家的理解凰慈,運行下邊的代碼會出現(xiàn)什么輸出呢汞幢?
<?php
class MyClass
{
public function test()
{
echo "this is not a static function.\n";
}
}
MyClass::test();
這段代碼是一個很明顯的靜態(tài)方式調(diào)用非靜態(tài)方法的例子,一般我們都會認為這樣寫的話微谓,運行時肯定會報錯的森篷,但其實不然输钩,PHP 其實是允許這么寫的,但是大家都知道這樣寫明顯是有問題的仲智,所以在新一點的 PHP 版本中张足,官方也不再建議這么寫,給出了一個E_STRICT
的警告坎藐。
具體情況如下:
在 PHP 5 之前這樣寫是不會報錯的为牍。
在 PHP 5 之后,官方引入了 E_STRICT
錯誤類型岩馍,對此官方的說明是啟用 PHP 對代碼的修改建議碉咆,以確保代碼具有最佳的互操作性和向前兼容性
,所以此時再用上邊的寫法蛀恩,運行時是會有錯誤警告的疫铜。
所以我強烈建議大家避免這種寫法,雖然語言層面可能允許你這么做双谆,但是這是因為歷史原因壳咕,語言無法做太大的革新,只能給以建議和警告顽馋。
可能有的同學會說『我用的版本高于PHP 5谓厘, 但是也沒有報錯提示啊』,這種情況下大家就需要去php.ini
里檢查一下自己的error_reporting
配置項是否配置了E_STRICT
寸谜,調(diào)整一下相關(guān)參數(shù)即可竟稳。
特別提示一下,在添加了
E_STRICT
錯誤類型之后熊痴,5.X 幾個小版本的更新中他爸,預(yù)定義的錯誤類型也是有一定的變更的,如下:
版本 | 說明 |
---|---|
5.0.0 | 引入 E_STRICT (但不包括在 E_ALL 之內(nèi))果善。 |
5.2.0 | 引入 E_RECOVERABLE_ERROR诊笤。 |
5.3.0 | 引入 E_DEPRECATED 和 E_USER_DEPRECATED。 |
5.4.0 | E_STRICT 成為 E_ALL 的一部分 |
特別說明:
- 本文只是淺顯的說明了一些相關(guān)現(xiàn)象和歷史演變巾陕,如果想了解更深入的語言設(shè)計和源碼實現(xiàn)(涉及到
calling scope
)讨跟,請自行Google。- 當你的函數(shù)名和類名相同時惜论,那就是另一種情況了许赃,不在本文的討論范圍中。