首頁 > 後端開發 > php教程 > PHP中可以靜態呼叫非靜態方法麼? (詭異的調用)

PHP中可以靜態呼叫非靜態方法麼? (詭異的調用)

WBOY
發布: 2016-07-30 13:30:34
原創
1379 人瀏覽過

1.PHP中可以靜態呼叫非靜態方法麼?

今天我被問到PHP中可不可以使用 className::methodName() 的方法來呼叫一個沒有宣告static的方法。在我的印像中,我好像是看過這種用法,但又有些不確定。大家都知道,在手冊或教學課程裡,方法被分成靜態方法 和非靜態方法,通常我們靜態呼叫的方法,一定是靜態方法。

那如果我們呼叫了非靜態方法會怎麼樣呢?首先做測試。

1 <?php
<?php

test{
3

    'it works'
functiontest() {       echo
;

5    }

}

7
test ::test();

8

1 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()這個方法比較特殊,與類別同名,是構造方法。 我們繼續測試。

01 <?php </td> </tr>class</tbody></table>test {<p></p> <table><tbody><tr> <td><code> 03
    function

test() {

       

echo
'it works';

05    function
     }
test2() {

        echo
07
'it works too'

08
'it works too';     }

09}

1005)
11? >

15
11
這說明,

靜態呼叫非靜態方法是可行的,但是靜態呼叫建構方法是不可以的

。為了驗證這個結論,我又做了以下測試: <?php
1

<?php
class test {

3     )

4echo ;
        'it works'

5 }
6

7
test::test();
?>

執行的結果如下:

1 Fatal error: Constructor test::test() cannot be static in /home/xxx/test.php on line 9

構造方法不能宣告靜態,所以上面的推論正確。

但這個結果的確是很特殊的,因為可能只有PHP可以靜態呼叫非靜態方法,我用Java做了實驗,如果靜態呼叫非靜態方法會報如下錯誤:

1
Cannot make a static reference to the non-static method showString() from the type HelloWorldApp

給我沒有足夠的其他語言

之處,關於為什麼PHP會有這樣的情況我暫時沒有找到相關說明。

2.靜態呼叫非靜態方法是否應該被應用?

那我們是不是可以用這種方法來取代static方法呢?

首先在程式碼的可讀性上來看,靜態呼叫非靜態方法當然是不被推薦的

,這會讓維護者產生疑惑。

接下來我們再做一些實驗,來看看靜態呼叫非靜態方法在效率上是否會有一定的優勢。 1
<?php

<?php test{

3     functiontest2() { }

5

6
for

(

$kfor$k
( <code>$k++) { test::test2();

8}

上面程式碼在我這裡的執行時間是18到28毫秒,我們再來測試標準的寫法。 1
<?php

<?php test{

3

    static functiontest2(){   
}

 
5

$k
6 for6;

$k

++) {
test::test2();

}
8

注意:PHP不能靜態呼叫非靜態屬性
上面的程式碼執行時間在5到10毫秒之間,這樣看來,靜態呼叫非靜態方法的效率比標準的靜態方法呼叫低的多,所以在效率上也不推薦靜態呼叫非靜態方法發現WordPress中居然在用這麼詭異的呼叫方式:class-wp.php 第206-207行:// Substitute the substring mat into the query. WP apply($query, $matches));這裡用的靜態調用,而實際的成員函數卻不是靜態的。

class
1 2
test{

3
  2$

; 4
    

function

test2() {

<p></p> <table><tbody><tr> <td><code>5         echo 6    

}}}

}}

7}$id
;

9
?>

Access 以上就介紹了PHP中可以靜態呼叫非靜態方法麼? (詭異的呼叫),包括了方面的內容,希望對PHP教程有興趣的朋友有所幫助。
相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板