在 PHP 中,可以使用類別名稱後接作用域解析運算子 (::) 來呼叫靜態方法。但是,通常不可能以相同的方式呼叫非靜態方法。
使用雙冒號語法的非靜態方法
下面的程式碼片段嘗試使用雙冒號語法呼叫非靜態方法fun1:
class Teste { public function fun1() { echo 'fun1'; } public static function fun2() { echo "static fun2" ; } } Teste::fun1(); // why? Teste::fun2(); // ok - is a static method
此程式碼將導致錯誤,因為無法透過類別名稱直接存取非靜態方法。
限制原因
PHP 對靜態方法和非靜態方法採用寬鬆類型。當靜態呼叫非靜態方法時,該方法內的 $this 關鍵字將不會引用該類別的實例。這種鬆散的行為可能會導致不一致和潛在錯誤的程式碼。
靜態方法變體
雙冒號語法僅允許用於呼叫靜態方法。這是一個範例:
class StaticExample { public static function staticMethod() { echo "static method"; } } StaticExample::staticMethod(); // valid
在非靜態方法中
可以從同一非靜態方法中靜態呼叫非靜態方法班級。在這種情況下,被呼叫方法內的 $this 仍將引用正確的物件實例。
class A { public function nonStaticMethod() { echo $this->name; } } class C { public function callNonStatic() { $this->name = 'Example'; A::nonStaticMethod(); // valid } } $c = new C; $c->callNonStatic(); // prints Example
以上是為什麼無法在 PHP 中使用雙冒號語法呼叫非靜態方法?的詳細內容。更多資訊請關注PHP中文網其他相關文章!