Xaop PHP 高性能的 AOP 扩展
xaop.method_prefix
— префикс метода, который необходимо исключить из анализа AOP. Если метод начинается с этого префикса, то AOP-анализ будет пропущен.xaop.aop_mode
— режим работы AOP, возможные значения: 1 (нормальный режим), 2 (режим документирования AOP), 3 (режим внедрения методов AOP).xaop.property_aop
— состояние режима свойств AOP: 1 (обычный режим), 2 (включён режим свойств AOP).git clone https://github.com/liqiongfan/xaop.git
cd xaop
sudo ./install
; 1 Не включать AOP
; 2 Включить режим документирования AOP
; 3 Включить режим внедрения методов AOP
xaop.aop_mode = 2
; Включать ли фильтрацию префиксов методов
; Этот режим работает только в режиме документирования AOP
xaop.method_prefix = ""
; Включить ли режим свойств AOP
; 1 Выключить 2 Включить
xaop.property_aop = 2
<?php
class Xaop {
public function beforeGetAction() {
echo 'Before GET Action' . PHP_EOL;
}
public function afterGetAction() {
echo 'After GET Action' . PHP_EOL;
}
public function getXaop() {
echo 'getXaop method' . PHP_EOL;
}
}
Обратите внимание: второй параметр метода добавления AOP поддерживает одно или несколько символов, используя несколько *
приведёт к сбою сопоставления и отключению AOP.
Вот пример использования двух видов предварительных AOP (остальные виды аналогичны):
Xaop::addBeforeAop(Xaop::class, "getXaop", function(){
echo 'Before';
});
Xaop::addBeforeAop(Xaop::class, "getXaop", [Xaop::class, "beforeGetAction"]);
[Примечание]: режим обхода AOP работает только в этом режиме, режим документирования не поддерживает режим обхода AOP. В режиме обхода AOP функция обратного вызова имеет один параметр ресурса, представляющий контекст OPCODE исходного метода. Если пользователь не выполняет Xaop::exec($resOpCode)
, то исходный метод не выполняется и теряется.
Xaop::addAroundAop(Xaop::class, "getXaop", function($resCode){
echo 'Before';
Xaop::exec($resCode); // Если эта строка не выполнена, исходный метод не будет выполнен и будет потерян
echo 'After';
});
class Xaop {
public function actionBefore($resCode) {
echo 'Before Code'. PHP_EOL;
Xaop::exec($resCode);
echo 'After Code' . PHP_EOL;
}
public function getXaop() {
echo 'getXaop' . PHP_EOL;
}
}
Xaop::addAroundAop(Xaop::class, "getXaop", [Xaop::class, "actionBefore"]);
[Примечание]: если одновременно указаны режимы обхода и другие режимы AOP, то все режимы, кроме режима обхода, будут отключены, и система будет работать в режиме обхода.
Xaop поддерживает пять режимов AOP: предварительный AOP (addBeforeAop
), последующий AOP (addAfterAop
), последующий возврат AOP (addAfterReturnAop
), последующий выброс исключения AOP (addAfterThrowAop
) и режим обхода AOP (addAroundAop
).
Среди них режим обхода AOP конфликтует с другими режимами AOP. Если существует режим обхода AOP, система будет использовать режим обхода AOP по умолчанию, а функция обратного вызова режима обхода AOP имеет один параметр: $xaopExec
— ресурс, представляющий контекст метода входа. В режиме обхода AOP, если он не находится в методе обхода AOP, вызовите Xaop::exec($xaopExec)
. Фактический метод будет потерян и не будет вызван. В режиме обхода фактический метод должен быть вызван разработчиком вручную, и в одном и том же обратном вызове метод вызывает несколько раз Xaop::exec($xaopExec)
, он будет выполняться только один раз и последующие вызовы будут неэффективны. Например:
Xaop::addAroundAop(NULL, "__get*", function($exec){
echo '_before<br>';
Xaop::exec($exec); // Здесь вызов несколько раз, Xaop автоматически перехватывает и выполняет только один раз
echo '_after<br>';
});
Xaop поддерживает режим свойств AOP для объектов: поддерживает предварительные и последующие точки входа, но не реализует режим обхода, потому что разработчик может использовать магические методы для обработки. Простой пример:
<?php
class Swing {
public $di = 'Xaop';
}
Xaop::addPropertyBeforeReadAop(Swing::class, 'di', function($object, $propertyName){
echo '_before';
});
Xaop::addPropertyAfterReadAop(Swing::class, 'di', function($object, $propertyName){
echo '_after';
});
// Вызов свойства
$swing = new Swing();
echo $swing->di;
// Вывод:
_before Xaop _after
<?php
/**
* Class Swing
* @Aspect
*/
class Swing {
function _magicGetBefore() {
echo '_magicGetBefore()' . PHP_EOL;
}
function _magicGetAfter() {
echo '_magicGetAfter()' . PHP_EOL;
}
function _magicSuccess() {
echo '_magicSuccess()' . PHP_EOL;
}
function _magicFailure() {
echo '_magicFailure()' . PHP_EOL;
}
/**
* @before( value="Swing._magicGetBefore" )
* @after( value="Swing._magicGetAfter" )
* @success( value="Swing._magicSuccess" )
*/
public function __get($name) {
echo '__get' . PHP_EOL;
return true;
}
/**
* @before( value="Swing._magicGetBefore" )
* @after( value="Swing._magicGetAfter" )
* @failure( value="Swing._magicFailure" )
*/
public function __set($name, $value) {
echo '__set' . PHP_EOL;
return false;
}
}
Пример 1:
// Вызвать __get
$swing = new Swing();
$swing->di
Вывод:
_magicGetBefore()
__get
_magicSuccess()
_magicGetAfter()
Пример 2:
// Вызвать __set
$swing =
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )