PHP Вызов self по нестационарному методу

Почему в этом примере работает «сам» вызов несекретного метода?

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, и, как говорят эти документы , оператор :: не ограничивается статическими вызовами:

двойной двоеточие , является токеном, который позволяет получить доступ к статическим, постоянным и переопределенным свойствам или методам класса

Таким образом, это нормально, если вы ссылаетесь на этот способ метод или свойства родительского класса, который не ограничивается прямым родителем.