非静态调用静态方法

Jer*_*auw 0 php static

我遇到了这样的事情,不知道该怎么办。是否有充分的理由这样做或避免这样做?

class Foo {

  static public function bar() {}

}

someMethod() {

  $instanceOfFoo->bar();

}
Run Code Online (Sandbox Code Playgroud)

Sho*_*hoe 5

PHP 文档说:

[...] 声明为静态的属性不能被实例化的类对象访问(尽管静态方法可以)。[...] 无法使用箭头运算符 -> 通过对象访问静态属性。

没有为被调用的静态方法指定任何特殊的东西->。但是,您绝对应该避免使用它,因为它会给希望$obj->meth()成为非静态方法和Cls::meth()静态方法的读者造成混淆。

令人惊讶的是,这种行为不会触发任何错误。这样做的原因是在运行时$object->method()内部调用了一个静态方法className::method()(唯一的区别$this = NULL是设置了)。