請看下邊一段代碼,以大家的理解,運(yùn)行下邊的代碼會(huì)出現(xiàn)什么輸出呢?
<?php
class MyClass
{
public function test()
{
echo "this is not a static function.\n";
}
}
MyClass::test();
這段代碼是一個(gè)很明顯的靜態(tài)方式調(diào)用非靜態(tài)方法的例子,一般我們都會(huì)認(rèn)為這樣寫的話,運(yùn)行時(shí)肯定會(huì)報(bào)錯(cuò)的,但其實(shí)不然,PHP 其實(shí)是允許這么寫的,但是大家都知道這樣寫明顯是有問題的,所以在新一點(diǎn)的 PHP 版本中,官方也不再建議這么寫,給出了一個(gè)E_STRICT 的警告。
具體情況如下:
在 PHP 5 之前這樣寫是不會(huì)報(bào)錯(cuò)的。
在 PHP 5 之后,官方引入了 E_STRICT 錯(cuò)誤類型,對此官方的說明是啟用 PHP 對代碼的修改建議,以確保代碼具有最佳的互操作性和向前兼容性,所以此時(shí)再用上邊的寫法,運(yùn)行時(shí)是會(huì)有錯(cuò)誤警告的。
所以我強(qiáng)烈建議大家避免這種寫法,雖然語言層面可能允許你這么做,但是這是因?yàn)闅v史原因,語言無法做太大的革新,只能給以建議和警告。
可能有的同學(xué)會(huì)說『我用的版本高于PHP 5, 但是也沒有報(bào)錯(cuò)提示啊』,這種情況下大家就需要去php.ini里檢查一下自己的error_reporting 配置項(xiàng)是否配置了E_STRICT,調(diào)整一下相關(guān)參數(shù)即可。
特別提示一下,在添加了
E_STRICT錯(cuò)誤類型之后,5.X 幾個(gè)小版本的更新中,預(yù)定義的錯(cuò)誤類型也是有一定的變更的,如下:
| 版本 | 說明 |
|---|---|
| 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è)計(jì)和源碼實(shí)現(xiàn)(涉及到
calling scope),請自行Google。- 當(dāng)你的函數(shù)名和類名相同時(shí),那就是另一種情況了,不在本文的討論范圍中。