Ответ 1
Как уже указывал Баба, в зависимости от вашей конфигурации это приводит к E_STRICT
.
Но даже если это не проблема для вас, я думаю, стоит упомянуть некоторые из ошибок, которые могут возникнуть в результате вызова статических методов нестационарным способом.
Если у вас есть иерархия классов, например
class A {
public static function sayHello() {
echo "Hello from A!\n";
}
public function sayHelloNonStaticWithSelf() {
return self::sayHello();
}
public function sayHelloNonStaticWithStatic() {
return static::sayHello();
}
}
class B extends A {
public static function sayHello() {
echo "Hello from B!\n";
}
public function callHelloInMultipleDifferentWays() {
A::sayHello();
B::sayHello();
$this->sayHelloNonStaticWithSelf();
$this->sayHelloNonStaticWithStatic();
$this->sayHello();
}
}
$b = new B();
$b->callHelloInMultipleDifferentWays();
Это приводит к следующему выводу:
Hello from A!
// A::sayHello() - obvious
Hello from B!
// B::sayHello() - obvious
Hello from A!
// $this->sayHelloNonStaticWithSelf()
// self alweays refers to the class it is used in
Hello from B!
// $this->sayHelloNonStaticWithStatic()
// static always refers to the class it is called from at runtime
Hello from B!
// $this->sayHello() - obvious
Как вы можете видеть, легко добиться неожиданного поведения при смешивании статических и нестатических вызовов и методов метода.
Поэтому мой совет также таков: Используйте Класс:: метод, чтобы явно вызвать статический метод, который вы хотите вызвать. Или даже лучше не использовать статические методы вообще, потому что они делают ваш код неустойчивым.