2013-04-02 91 views
0

我遇到過這樣的事情,我不知道該怎麼做。有沒有很好的理由來做到這一點,或避免它?非靜態地調用一個靜態方法

class Foo { 

    static public function bar() {} 

} 

someMethod() { 

    $instanceOfFoo->bar(); 

} 
+0

如果這是另一種語言,它可能會引發錯誤。我想,無論是由一個忘記它被宣佈爲靜態的初學者寫的,還是由一個根據上下文利用事實做出不同事情的專家寫的。我強烈建議將它重構爲兩種方法,一種是靜態的,另一種則不是。 –

+0

在你的問題上拋出更多的光。 – diEcho

+0

[非靜態調用靜態方法]的可能的副本(http://stackoverflow.com/questions/15707029/calling-static-method-non-statically) – Ejaz

回答

4

PHP的文件說:

[...]聲明爲靜態不能與實例化的類對象(儘管一個靜態方法可以)訪問的屬性。 [...]使用箭頭運算符 - >不能通過對象訪問靜態屬性。

沒有指定什麼特殊的靜態方法被->調用。儘管如此,你應該避免它,因爲它會導致讀者期望$obj->meth()是一種非靜態方法,而Cls::meth()是一種靜態方法。

出乎意料的是這種行爲is not triggering有任何錯誤。原因是在運行時將一個名爲$object->method()的靜態方法內部翻譯爲className::method()(唯一的區別是設置了$this = NULL)。

0

您可以調用如下的特定函數。

Foo::bar(); 

您不必創建一個對象來調用靜態函數。基本上我們編寫靜態函數來調用函數,而不用它定義的類的實例。

可以用一個對象調用一個靜態函數,但是爲什麼當你有一個更簡單更簡潔的方法時呢。

+0

我想這個問題會問怎麼想通過實例調用靜態方法的代碼,而不是如何調用靜態方法。事實上,我認爲海報非常瞭解靜態會員的傳統用法。 –

+1

我給了他我的觀點,告訴他他寫的東西不是必需的。 – Techie