這是如何工作的?不應該這會拋出一個錯誤,因爲我試圖靜態調用一個非靜態方法?基本上,我從來沒有實例化一個類型的東西的對象。PHP靜態調用方法;即使其未定義爲靜態
class Something {
public function helloworld() {
echo 'hello world';
}
}
Something::helloworld();
這是如何工作的?不應該這會拋出一個錯誤,因爲我試圖靜態調用一個非靜態方法?基本上,我從來沒有實例化一個類型的東西的對象。PHP靜態調用方法;即使其未定義爲靜態
class Something {
public function helloworld() {
echo 'hello world';
}
}
Something::helloworld();
將這個在你的腳本的頂部:
error_reporting(E_ALL | E_STRICT); // E_STRICT is important here
ini_set('display_errors', true);
...看到那麼會發生什麼:
嚴格的標準:非靜態方法::東西的HelloWorld()不應該 可以在[...]
不可否認,它比一個錯誤的通知,雖然靜態調用。你的腳本將繼續愉快地繼續運行。
它只會給你一個錯誤,如果內helloworld()
你會使用$this
。
這是一種由於缺少規格而導致的PHP「WTF」類型,它允許您靜態調用一個實際上沒有聲明的函數static
。
IIRC,它不是一個丟失的規範,它只是向後兼容PHP 4. – hakre
...沒有規格。 –
嗯,它不是逐字寫出來的,但是如果你閱讀[PHP 5 docs](http://www.php.net/manual/en/language.oop5.static.php),那麼清楚地寫出未指定就像上市。而在PHP 4中,公共函數可以靜態調用。所以實際上它被記錄下來,甚至在靜態章節中。另請參閱:http://php.syntaxerrors.info/index.php?title=Call_to_undefined_function#NOTE:_Static_methods_in_PHP4 - 僅供參考,通常情況下,您不應該再關心PHP 4。 – hakre
沒什麼特別的,只是'$ this = null'。 –
[PHP:通過ClassName ::方法語法調用實例方法,導致靜態調用?]的可能重複(http://stackoverflow.com/questions/4664511/php-call-to-an-instance-method -via-classnamemethod-syntax-results-in-a-static) – Gordon