PHP вызывает self на нестатическом методе
почему в этом примере работает "self" -вызов метода non-satic?
class A{
protected function aNonStaticMethod(){
return __class__;
}
public function aEcho(){
echo self::aNonStaticMethod();
}
}
Спасибо за объяснение.
2 ответов
вызов нестатического метода статически
теоретически это должно не работать, а как этой комментарии:
в php4 не было статического ключевого слова, но php4 допускал статическое звонки. Для поддержания обратной совместимости это было оставлено, когда static ключевое слово было добавлено в php5.
этот комментарий поддерживается этой официальный php.net wiki:
Это уже устарел, если вызов происходит из метода экземпляра. Не аннотирование методов как статических является устаревшим PHP4-ism.
вы действительно не должны вызывать нестатический метод статически - это не имеет смысла (если есть static
ключевое слово).
избегайте вызова нестатических методов статически полностью!
...потому что a) это плохой подход б)PHP docs скажи:
осторожностью
в PHP 5 вызов нестатических методов статически генерирует предупреждение уровня E_STRICT.
и
предупреждение
в PHP 7 вызов нестатических методов статически устарел и будет генерировать предупреждение E_DEPRECATED. Поддержка вызова нестатических методов статически может быть удалена в будущем.
используя ::
оператора нестатические звонки - может быть хороший подход!
как указал @Kontrollfreak и как это docs сказать ::
оператор не ограничивается статическими вызовами:
на двойной, является маркером, который позволяет получить доступ к статическим, постоянным, и переопределенные свойства или методы класса
так что это нормально, если вы ссылаетесь таким образом на метод или свойства из родительский класс - что is не ограничено прямой родитель.
в вашем простом примере $this и self взаимозаменяемы. Но имейте в виду другой метод разрешения при работе с наследованием (я добавил static для полноты):
class A {
protected function aNonStaticMethod(){
return __class__;
}
public function selfEcho(){
echo self::aNonStaticMethod();
}
public function staticEcho(){
echo static::aNonStaticMethod();
}
public function thisEcho(){
echo $this->aNonStaticMethod();
}
}
class B extends A {
protected function aNonStaticMethod(){
return __class__;
}
}
$b = new B();
$b->selfEcho(); // A
$b->staticEcho(); // B
$b->thisEcho(); // B