Задать вопрос
developer
@developer

Правильно прокоментировать PHP BUG#61084?

bugs.php.net/bug.php?id=61084

Очевидно, люди не понимают мой английский.


Ситуация проста и демонстрирует некорретное поведение интерпретатора, которое состоит в том, что при использовании не статической функции класса (method A::m()) внутри объекта другого класса (class C) как функцию класса контекст переменных внутри функции (A::m()), объявленных в первом классе (A) через ключевое слово static переключается на контекст класса объекта (C) в котором происходит вызов метода.


PS. И по русски то непонятно, да? Запустите, пожалуйста, приведенный код (10 строк) и прочтите его — сразу станет все очевидно.
  • Вопрос задан
  • 2712 просмотров
Подписаться 2 Оценить Комментировать
Решения вопроса 1
Неожиданно, но такое поведение упоминается в мануале: http://ru.php.net/manual/en/language.oop5.basic.php#language.oop5.basic.class.this
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 4
7workers
@7workers
сделайте error_reporting(E_ALL|E_STRICT); и увидите ворнинг который ожидаете. Не вижу бага в упор. Как Вам там и написали, Ваш код выглядит странно. Если сделать E_STRICT репортинг то PHP Вам сообщит об этом. Если Вы об этом не хотите слышать — дело Ваше, но тогда легко запутаться.
Ответ написан
@xmeoff
Вам же ответили: вы пишете некорректный код, потому и получаете ошибку. И какая разница, что в ее описании? ошибка она и есть ошибка.
И по 2-му примеру тоже дано объяснение: нельзя вызывать нестатическую функцию как статическую. В вашем примере функция m на самом деле вызывается как нестатическая, отсюда и необычное поведение.
Ответ написан
Комментировать
developer
@developer Автор вопроса
да, я в написал вопрос на хабре до того как смог объясниться с представителем поддержки, действительно так задуманно.
Ответ написан
developer
@developer Автор вопроса
Все коментарии, кроме коментария sectus даны не по делу и говорят скорее о непонимании вопроса. sectus'у отдельное спасибо, возможно документация будет расширена для static, но в любом случае выяснено, что контекст static ведет себя в этом аспекте больше как контекст $this нежеле как контекст self это и было неожиданностью, явным образом не задокументированной.
Про E_STRICT и историю нахождения этого примера расскажу: на одной из машин девелопера стоял PHP со стандартными настройками, когда он столкнулся со странностями работы он передал код мне где я сразуже увидел Strict однако даже в этом случае поведение показалось мне неожаднным и я захотел разобраться в чем дело. С версии PHP 5.4 E_STRICT будет частью E_ALL и это радует!
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы