PHP - статьи


Основы аспектно-ориентированного подхода - часть 2


$aspect1 = new Aspect();

Далее мы можем создать Pointcut и сообщить, какие методы он затрагивает.

$pc1 = $aspect1->pointcut("call Sample::Sample or call Sample::Sample2");

Осталось лишь сообщить программный код для входной и выходной точек методов текущего среза.

$pc1->_before("print 'Aspect1 preprocessor<br />';"); $pc1->_after("print 'Aspect1 postprocessor<br />';");

Аналогичным образом мы можем описать дополнительный аспект, например:

$aspect2 = new Aspect(); $pc2 = $aspect2->pointcut("call Sample::Sample2"); $pc2->_before("print 'Aspect2 preprocessor<br />';"); $pc2->_after("print 'Aspect2 postprocessor<br />';");

Для того, чтобы задействовать один или несколько аспектов, достаточно воспользоваться функцией Aspect::apply()

Aspect::apply($aspect1); Aspect::apply($aspect2);

Как вам, возможно, известно, в PHP до 5-й версии достаточно проблематично обслуживать события методов и классов. Если для событий глобального характера, таких как ошибки PHP, можно написать собственный обработчик, то для обработки, скажем, событий на входе и выходе методов придется "вручную" расставить "оповещатели". В нашем случае потребуется расставлять специальные функции

Advice::_before(); и Advice::_after(); class Sample { function Sample() { Advice::_before(); print 'Class initilization<br />'; Advice::_after(); return $this; } function Sample2() { Advice::_before(); print 'Business logic of Sample2<br />'; Advice::_after(); return true; } }

Как видно из примера, до кода бизнес-логики метода и после него установлены "оповещатели" этих событий. Когда процессор PHP минует такой "оповещатель", он проверяет, нет ли активных аспектов. В случае наличия такового, PHP проверяет, указана ли текущая функция в диапазоне Pointcut. Если и это условие верно, вызывается назначенная нами функция для данного события (например для Advice::_before()). Видите - как я и обещал, все достаточно просто. Но дает ли этот подход реальную пользу?

Давайте представим, что мы расставили во всех методах классов наших скриптов "оповещатели" и подключили библиотеку aop.lib.php. И вот однажды нам потребовалось получить подробный отчет о распределении нагрузки по выполняемым функциям нашего проекта. Мы создаем аспект и назначаем ему Pointcut, охватывающий все функции проекта.




Начало  Назад  Вперед



Книжный магазин