2009-11-17 46 views
3

爲什麼在PHP中這是合法的?使用PHP中的類的非靜態函數

<?php 
class Foo { 
    public function test() { 
     echo "hello\n"; 
    } 
} 

Foo::test(); 
?> 

test()是一個非靜態函數,但我可以在沒有實例的情況下訪問它。

回答

5

我相信這是因爲向後兼容。在PHP4中,您沒有方法的static關鍵字(仍在尋找引用,但到目前爲止,這些都是我找到的所有http://us2.php.net/manual/en/language.oop5.static.php)。這樣,PHP4代碼仍然可以毫無問題地運行。

將靜態函數聲明爲更好的做法是,如果打開E_STRICT,您會看到一條關於此的通知。

error_reporting(E_ALL | E_STRICT);

更新:嗯,這是我發現http://bugs.php.net/bug.php?id=34990http://bugs.php.net/bug.php?id=47891最好的。

-2

我不相信你可以通過一個對象的實例訪問一個類的方法。

+1

不,你可以。這確實有用。 – ryeguy 2009-11-17 21:57:25

6

這是合法的,但通常會皺起眉頭,直到您在靜態調用的方法中引用$this,這會引發致命錯誤。

2

PHP Manual

調用非靜態方法靜態 產生E_STRICT級別的警告。

0

這是可行的,因爲您尚未啓用E_STRICT錯誤級別。一旦啓用PHP將停止讓你這樣做。