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

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

特別說明:

  1. 本文只是淺顯的說明了一些相關(guān)現(xiàn)象和歷史演變,如果想了解更深入的語言設(shè)計(jì)和源碼實(shí)現(xiàn)(涉及到calling scope),請自行Google。
  2. 當(dāng)你的函數(shù)名和類名相同時(shí),那就是另一種情況了,不在本文的討論范圍中。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容