1.PHP中可以靜態呼叫非靜態方法麼?
今天我被問到PHP中可不可以使用 className::methodName() 的方法來呼叫一個沒有宣告static的方法。在我的印像中,我好像是看過這種用法,但又有些不確定。大家都知道,在手冊或教學課程裡,方法被分成靜態方法 和非靜態方法,通常我們靜態呼叫的方法,一定是靜態方法。
那如果我們呼叫了非靜態方法會怎麼樣呢?首先做測試。
<?php
3
function test() { |
echo |
'it works'
;
}
test ::test();
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() {
test2() {
'it works too'
這說明,
靜態呼叫非靜態方法是可行的,但是靜態呼叫建構方法是不可以的
。為了驗證這個結論,我又做了以下測試:
|
1
|
<?php
?>
執行的結果如下:
1 |
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會有這樣的情況我暫時沒有找到相關說明。
2.靜態呼叫非靜態方法是否應該被應用?
那我們是不是可以用這種方法來取代static方法呢?
首先在程式碼的可讀性上來看,靜態呼叫非靜態方法當然是不被推薦的
,這會讓維護者產生疑惑。
接下來我們再做一些實驗,來看看靜態呼叫非靜態方法在效率上是否會有一定的優勢。
|
| 1
<?php
for(
$k
for(
| $k<code>$k ++) {
test::test2();
|
上面程式碼在我這裡的執行時間是18到28毫秒,我們再來測試標準的寫法。
|
| 1
<?php
3
}
$k
|
上面的程式碼執行時間在5到10毫秒之間,這樣看來,靜態呼叫非靜態方法的效率比標準的靜態方法呼叫低的多,所以 在效率上也不推薦靜態呼叫非靜態方法。 發現WordPress中居然在用這麼詭異的呼叫方式:
class-wp.php 第206-207行: // Substitute the substring mat into the query. WP apply($query, $matches)); 這裡用的靜態調用,而實際的成員函數卻不是靜態的。
| 注意:PHP不能靜態呼叫非靜態屬性
test{
2$
function
test2() {
<p></p>
<table><tbody><tr>
<td><code>5
echo
| 6
;
?>
Access
|
以上就介紹了PHP中可以靜態呼叫非靜態方法麼? (詭異的呼叫),包括了方面的內容,希望對PHP教程有興趣的朋友有所幫助。 |