PHP中靜態方法可以存取非靜態方法,透過實例化對象,就可以呼叫對像中的非靜態方法;靜態方法雖然可以呼叫非靜態方法,但是不能夠呼叫建構方法。
本文操作環境:Windows10系統、PHP7.1版、Dell G3電腦。
如果我們呼叫了非靜態方法會怎麼樣呢?首先做測試。
<?php class test{ function test() { echo 'it works'; } } test::test(); ?>
執行以下,回傳錯誤如下:
Fatal error: Non-static method test::test() cannot be called statically in /home/×××/test.php on line 7 Call Stack: 0.0002 332548 1. {main}() /home/×××/test.php:0
這個時候,可能大家就會認為靜態呼叫非靜態方法是行不通的了,但其實,結論下的過早了,因為test()這個方法比較特殊,跟類別同名,是建構方法。 我們繼續測試。
<?php class test { function test() { echo 'it works'; } function test2() { echo 'it works too'; } } test::test2(); ?>
執行結果:
it works too
這說明,靜態呼叫非靜態方法是可行的,但是靜態呼叫建構方法是不可以的。為了驗證這個結論,我又做了以下測試:
<?php class test{ static function test() { echo 'it works'; } } test::test(); ?>
執行的結果如下:
Fatal error: Constructor test::test() cannot be static in /home/xxx/test.php on line 9
建構方法不能宣告靜態,所以上面的推論正確。
但這個結果的確是很特殊的,因為可能只有PHP可以靜態呼叫非靜態方法,我用Java做了實驗,如果靜態呼叫非靜態方法會報如下錯誤:
Cannot make a static reference to the non-static method showString() from the type HelloWorldApp
其他語言我沒有一一嘗試,但這已經足夠來說明PHP的特殊之處,關於為什麼PHP會有這樣的情況我暫時沒有找到相關說明。
推薦學習:《PHP影片教學》
以上是php中靜態方法可以存取非靜態方法嗎的詳細內容。更多資訊請關注PHP中文網其他相關文章!