При разработке крупных проектов довольно часто возникает ситуация, когда сквозной функционал, слабо относящийся к бизнес-логике, сильно раздувается, заполняя код однотипными конструкциями. Это может быть логирование операций, работа с кешем или проверка прав доступа. Тут нам на помощь приходит
АОП.
Для PHP существует несколько реализаций этой парадигмы программирования. К сожалению, среди них мне не удалось найти решение, которое бы можно было легко внедрить в уже существующий большой проект и удовлетворяющее эстетическим требованиям к коду.
Технологии реализации AOP в PHP
Волшебные методы
Самое простое решение — использование «
волшебных методов» __call и __callStatic. Эти методы вызываются (если они определены в классе) при обращении к несуществующему методу класса. В качестве аргументов они получают имя несуществующего метода и переданные ему параметры.
В данном случае, приложение строится таким образом, что реальные методы имеют имя отличное от имени указанном в вызывающих их конструкциях. Сквозной функционал реализуется в «волшебных методах», которые, при необходимости, передают управление реальным методам классов.
Плюсы:
- Легко начать использовать;
- Реализация не требует дополнительных модулей (нативный PHP).
Минусы:
- Не удобно использовать при большом количестве сквозного функционала;
- Т.к. имена методов в определении и в вызовах различаются, создаются трудности при использовании автодополнения кода в IDE.
Предварительный разбор кода
Этот способ подразумевает наличие посредника, позволяющего использовать «синтаксический сахар». Необходимый функционал описывается вспомогательным синтаксисом (xml/json конфигурация, дополнительные php-классы или аннотации в коде), который разбирается посредником. На основе разбора генерируется результирующий код, который содержит вставки сквозного функционала в необходимые места.
Плюсы:
- Работает быстро, т.к. на выходе это обычный PHP-код, просто сгенерированный за Вас автоматически.
Минусы:
- Сложно внедрить в большой проект;
- Требуется разбор кода после каждого изменения, для внесения корректировок в результирующий код.
Замена кода приложения во время выполнения