Комментарии 10
И вроде документация одна из лучших у веб-ориентированных языков программирования, но чем дальше в лес, тем безответственнее.
+1
НЛО прилетело и опубликовало эту надпись здесь
Отличный повод писать код проще )
+5
На первый взгляд имеется проблема, однако, но на самом деле данное поведение логично и легко объясняется.
В данном случае проблема проистикает из-за того, что Namespaces это compile time фитча — неймспейсы резолвятся на этапе компиляции, а не в runtime. Т.е. поскольку include происходит уже после того, как вы загрузили и создали экземпляр класса, вы загружаете переопределённый метод range. И естественно вам экземпляр класса на тот момент уже отрезолвился на стандартный range, а не на тот, что вы заключили в namespace.
Неймспейсы это вам не простой autoload классов с наследованием — здесь уже не всё так просто. Почему в PHP 5.3 работало, а в 5.4 перестало? Возможно это был баг и его исправили. Или недоработка. Но чисто логически всё абсолютно правильно в 5.4.
В данном случае проблема проистикает из-за того, что Namespaces это compile time фитча — неймспейсы резолвятся на этапе компиляции, а не в runtime. Т.е. поскольку include происходит уже после того, как вы загрузили и создали экземпляр класса, вы загружаете переопределённый метод range. И естественно вам экземпляр класса на тот момент уже отрезолвился на стандартный range, а не на тот, что вы заключили в namespace.
Неймспейсы это вам не простой autoload классов с наследованием — здесь уже не всё так просто. Почему в PHP 5.3 работало, а в 5.4 перестало? Возможно это был баг и его исправили. Или недоработка. Но чисто логически всё абсолютно правильно в 5.4.
+4
Очевидно при использовании функции нужно указывать ее namespace:
И это правильно. В PHP5.3 — переопределение global scope функций есть баго-фича. В PHP5.4 это пофиксили, и как бы намекают — пиши код очевидно для других.
public function makeMeRange()
{
return \range(1,3);
}
И это правильно. В PHP5.3 — переопределение global scope функций есть баго-фича. В PHP5.4 это пофиксили, и как бы намекают — пиши код очевидно для других.
+8
Вы не совсем поняли о чём пост. У функций можно не указывать namespace. Главное теперь чтобы объявление функции внутри namespace было до того, как она первый раз вызывается.
www.php.net/namespaces.fallback
www.php.net/namespaces.fallback
+2
В PHP5.4 это пофиксили, и как бы намекают — пиши код очевидно для других.
Интересно было узнать, где они эти намеки намекают. Я не нашел.
Логика в их решении, разумеется, есть. Тут не столько проблема самого изменения, сколько факт умолчания о нем. Именно поэтому статья писалась в информационных целях — предупредить сообщество.
0
НЛО прилетело и опубликовало эту надпись здесь
Может дело в этом:
php.net/ChangeLog-5.php
Added caches to eliminate repeatable run-time bindings of functions, classes, constants, methods and properties.
php.net/ChangeLog-5.php
+2
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Публикации
Изменить настройки темы
Недокументированные изменения или PHP 5.4 и перегрузка функций