Почему в этом примере работает «сам» вызов несекретного метода?
class A{ protected function aNonStaticMethod(){ return __class__; } public function aEcho(){ echo self::aNonStaticMethod(); } }
Спасибо за объяснение.
В вашем простом примере $ this и self взаимозаменяемы. Но имейте в виду разный метод решения при работе с наследованием (я добавил статичность для полноты):
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
Теоретически это не должно работать, но, как говорится в этом комментарии,
В php4 не было статического ключевого слова, но php4 разрешал статические вызовы. Чтобы поддерживать обратную совместимость, это осталось, когда статическое ключевое слово было добавлено в php5.
Этот комментарий поддерживается официальной php.net wiki:
Это уже устарело, если вызов происходит из метода экземпляра. Не аннотирующие методы как статические устаревшие PHP4-ism.
Вам не следует статически ставить нестатический метод – это не имеет смысла (если есть static
ключевое слово).
… потому что а) это плохой подход и б) в документах PHP говорится:
предосторожность
В PHP 5 вызов нестатических методов статически генерирует предупреждение уровня E_STRICT.
А ТАКЖЕ
Предупреждение
В PHP 7 вызов статических методов статически устарел и будет генерировать предупреждение E_DEPRECATED. Поддержка вызова нестатических методов статически может быть удалена в будущем.
::
оператора для нестатических вызовов – может быть хорошим подходом! Как заметил @Kontrollfreak, и, как говорят эти документы , оператор ::
не ограничивается статическими вызовами:
двойной двоеточие , является токеном, который позволяет получить доступ к статическим, постоянным и переопределенным свойствам или методам класса
Таким образом, это нормально, если вы ссылаетесь на этот способ метод или свойства родительского класса, который не ограничивается прямым родителем.