了解使用雙冒號(::) 的非靜態方法呼叫
嘗試使用下列語法呼叫非靜態方法時靜態方法(class ::method),您可能會遇到錯誤。與配置問題相反,這種行為是 PHP 設計所固有的。
在 PHP 中,非靜態方法需要先建立實例才能呼叫。發生錯誤的原因是使用 class::method 語法時,沒有明確提供實例。
靜態方法和非靜態方法的差異
靜態方法可以在不呼叫的情況下呼叫類別的實例,而非靜態方法則需要實例。這種差異在下面的範例中很明顯:
class Teste { public function fun1() { echo 'fun1'; } public static function fun2() { echo "static fun2" ; } } Teste::fun2(); // This is valid because fun2 is a static method Teste::fun1(); // This will generate an error because fun1 is not a static method
不一致的行為
但是,PHP 與靜態呼叫的非靜態方法表現出一些不一致的行為。如果從同一類別的非靜態方法中靜態呼叫非靜態方法,非靜態方法中的 $this 將引用該類別的目前實例。
class A { public function test() { echo $this->name; } } class C { public function q() { $this->name = 'hello'; A::test(); } } $c = new C; $c->q(); // This will print 'hello'
此行為啟用嚴格錯誤報告後可視為錯誤。
結論
呼叫非靜態方法通常不鼓勵使用靜態方法的語法。它可能會導致意外的行為或錯誤。相反,建議使用正確的語法來呼叫非靜態方法,這涉及創建類別的實例,然後在該實例上呼叫該方法。
以上是為什麼無法使用雙冒號 (::) 運算子來呼叫非靜態 PHP 方法?的詳細內容。更多資訊請關注PHP中文網其他相關文章!