PHP 靜態(tài)方式調(diào)用非靜態(tài)方法的一些說明

請看下邊一段代碼,以大家的理解,運行下邊的代碼會出現(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 的一部分

特別說明:

  1. 本文只是淺顯的說明了一些相關(guān)現(xiàn)象和歷史演變,如果想了解更深入的語言設(shè)計和源碼實現(xiàn)(涉及到calling scope),請自行Google。
  2. 當(dāng)你的函數(shù)名和類名相同時,那就是另一種情況了,不在本文的討論范圍中。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • php.ini設(shè)置,上傳大文件: post_max_size = 128Mupload_max_filesize ...
    bycall閱讀 6,834評論 3 64
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,467評論 25 708
  • 簡介 PHP提供了錯誤處理和日志記錄的功能. 這些函數(shù)允許你定義自己的錯誤處理規(guī)則,以及修改錯誤記錄的方式. 這樣...
    零一間閱讀 674評論 0 2
  • ![(http://upload-images.jianshu.io/upload_images/43241-31...
    _FLY_閱讀 794評論 0 1
  • 1生活中總有一些人喜歡使用暴力,喜歡虐待別人,因為欺辱別人會產(chǎn)生一種快感。用暴力壓制自己的戀人或者是朋友也是同樣的...
    岳小姐閱讀 1,035評論 0 1