![]() |
+7 (495) 229-0436 | ![]() |
shopadmin@itshop.ru | 119334, г. Москва, ул. Бардина, д. 4, корп. 3 | ![]() |
![]() |
![]() |
|
|
Недокументированные изменения или PHP 5.4 и перегрузка функций05.10.2012 13:24
vatson
Как это былоНе так давно столкнулся с одной проблемой, возникшей при переезде на php 5.4. Задача состояла в тестировании функционала, который использовал родные функции. К слову, Fumocker отлично справляется с этой задачей, позволяя в тестах переопределять встроенные функции. Я написал пачку тестов и запустил их локально. Все тесты прошли успешно. Отлично! Задача была сделана и я был в полном счастье, пока не добавил проект в travis-ci. И? Сборка была сломана под php 5.4, когда под 5.3 всё светилось зелёным. Именно этот факт навел меня на мысль, что между 5.3 и 5.4 должна быть разница в перегрузке функций.
Ну что, приступим?Первым желанием возникло создать песочницу для воспроизведения ситуации. Для этого я написал простейший класс, который использовал встроенную функцию range:
и отдельный файл с переопределением этой функции в одноименной области видимости:
Затем мне стало интересно, что произойдет, если мы подключим файлы с определением класса и функции перед созданием первого объекта MyClass:
В этом случае поведение одинаковое для двух версий:
Но что должно случиться, если подключить файл с функцией после создания первого экземпляраMyClass?
По-прежнему никакой разницы:
Остается последний шанс найти причину двуликости поведения - попробовать вызвать функцию перед включением файла с переопределением этой же функции:
Ага! Попалась!
И последний-препоследний эксперимент (обещаю):
подтверждает разницу в перегрузке функции между 5.3 и 5.4:
В итогеПолучается, что php 5.3 дает переопределить функцию в любой момент выполнения скрипта, если функция не была переопределена до этого. Когда в это же время php 5.4 будет использовать лишь ту версию функции, какая была впервые использована где-либо в коде. Кроме описанной проблемы, эта статья подымает давний вопрос - "акутальность документации". Да, мы до сих пор вынуждены использовать неполноценную документацию на свой страх и риск. По-моему, это позор на наши головы. P.S.: Я создал репозиторий для тестирования описанного поведения. На случай если захотите самостоятельно проверить просто склонируйте репозиторий и запустите тесты с помощью phpunit P.S.S: А еще есть открытый тиктет #63201 на bugs.php.net. Любое участие в данном вопросе приветствуется! Ссылки по теме |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
О нас |
Интернет-магазин ITShop.ru предлагает широкий спектр услуг информационных технологий и ПО.
На протяжении многих лет интернет-магазин предлагает товары и услуги, ориентированные на бизнес-пользователей и специалистов по информационным технологиям. Хорошие отзывы постоянных клиентов и высокий уровень специалистов позволяет получить наивысший результат при совместной работе. В нашем магазине вы можете приобрести лицензионное ПО выбрав необходимое из широкого спектра и ассортимента по самым доступным ценам. Наши менеджеры любезно помогут определиться с выбором ПО, которое необходимо именно вам. Также мы проводим учебные курсы. Мы приглашаем к сотрудничеству учебные центры, организаторов семинаров и бизнес-тренингов, преподавателей. Сфера сотрудничества - продвижение бизнес-тренингов и курсов обучения по информационным технологиям.
|
119334, г. Москва, ул. Бардина, д. 4, корп. 3 +7 (495) 229-0436 shopadmin@itshop.ru |
|
© ООО "Interface Ltd." Продаем программное обеспечение с 1990 года |