Переопределение Функций В Php 5.3

PHP 5.3 уже не новость и о нем много написано (и как-то приелось после выхода версии 5.4).

Однако хотелось бы остановиться на одной из его особенностей.

Одной из наиболее ярких особенностей этой версии является поддержка пространств имен, что повлекло за собой изменение парадигмы программирования PHP. Соответственно, многие, известные и не очень, фреймворки начали переписывать свой код по-новому.

Эта статья именно то, к чему все это привело.

Небольшой пример*:

  \\index.php

namespace Zend\Date {

function is_object($date) {

echo "Zend Date constructor is called with param {$date}";exit;

}

}

namespace Foo {

require_once 'zf2/library/Zend/Loader/AutoloaderFactory.php';

\Zend\Loader\AutoloaderFactory::factory(array('Zend\Loader\StandardAutoloader' => array()));

$date = new \Zend\Date\Date('2012-03-18');

}

Что тут происходит? Я переопределил функцию is_object, которая вызывается в самом начале конструктора \Zend\Date\Date. Если вы измените определение функции так, чтобы значение передавалось по ссылке, вы сможете изменить не только результат, но и сами параметры, передаваемые в функцию.

Этот код работает, потому что php по умолчанию ищет функцию в объявленном пространстве имен и только если ее там нет, переходит к поиску в глобальном пространстве имен.

И мы можем объявлять пространства имен с одинаковыми именами где угодно и столько раз, сколько захотим.

Кстати, та же история и с константами.

Эта функция предоставляет отличные возможности отладки и тестирования (прощай, Runkit), но она также открывает огромную дыру в безопасности приложения.

Если вы считаете, что эта функция является проблемой для вашего кода, то вы можете избежать ее, просто добавив обратную косую черту (\) к вызову функции (константы).

Тогда PHP немедленно начнет искать определение в глобальном пространстве имен.

В заключение хочу сказать, что на данный момент подобные вещи можно делать в Zend, Symfony, Doctrine. * — версия интерпретатора 5.4.0RC9-dev УПД: Часто задаваемые вопросы: что нужно знать о пространствах имен Теги: #php #php

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2011-02-20 12:48:08
Баллов опыта: 586
Всего постов на сайте: 3
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.