我遇到過這樣的事情,我不知道該怎麼做。有沒有很好的理由來做到這一點,或避免它?非靜態地調用一個靜態方法
class Foo {
static public function bar() {}
}
someMethod() {
$instanceOfFoo->bar();
}
我遇到過這樣的事情,我不知道該怎麼做。有沒有很好的理由來做到這一點,或避免它?非靜態地調用一個靜態方法
class Foo {
static public function bar() {}
}
someMethod() {
$instanceOfFoo->bar();
}
PHP的文件說:
[...]聲明爲靜態不能與實例化的類對象(儘管一個靜態方法可以)訪問的屬性。 [...]使用箭頭運算符 - >不能通過對象訪問靜態屬性。
沒有指定什麼特殊的靜態方法被->
調用。儘管如此,你應該避免它,因爲它會導致讀者期望$obj->meth()
是一種非靜態方法,而Cls::meth()
是一種靜態方法。
出乎意料的是這種行爲is not triggering有任何錯誤。原因是在運行時將一個名爲$object->method()
的靜態方法內部翻譯爲className::method()
(唯一的區別是設置了$this = NULL
)。
您可以調用如下的特定函數。
Foo::bar();
您不必創建一個對象來調用靜態函數。基本上我們編寫靜態函數來調用函數,而不用它定義的類的實例。
可以用一個對象調用一個靜態函數,但是爲什麼當你有一個更簡單更簡潔的方法時呢。
我想這個問題會問怎麼想通過實例調用靜態方法的代碼,而不是如何調用靜態方法。事實上,我認爲海報非常瞭解靜態會員的傳統用法。 –
我給了他我的觀點,告訴他他寫的東西不是必需的。 – Techie
如果這是另一種語言,它可能會引發錯誤。我想,無論是由一個忘記它被宣佈爲靜態的初學者寫的,還是由一個根據上下文利用事實做出不同事情的專家寫的。我強烈建議將它重構爲兩種方法,一種是靜態的,另一種則不是。 –
在你的問題上拋出更多的光。 – diEcho
[非靜態調用靜態方法]的可能的副本(http://stackoverflow.com/questions/15707029/calling-static-method-non-statically) – Ejaz