在 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中文网其他相关文章!