請看下邊一段代碼,以大家的理解,運行下邊的代碼會出現(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 對代碼的修改建議,以確保代碼具有最佳的互操作性和向前兼容性
,所以此時再用上邊的寫法,運行時是會有錯誤警告的。
所以我強烈建議大家避免這種寫法,雖然語言層面可能允許你這么做,但是這是因為歷史原因,語言無法做太大的革新,只能給以建議和警告。
可能有的同學(xué)會說『我用的版本高于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。- 當(dāng)你的函數(shù)名和類名相同時,那就是另一種情況了,不在本文的討論范圍中。