1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/josinli-xaop

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Xaop PHP 高性能的 AOP 扩展

Функциональные особенности

  • Основанный на объектах режим документирования AOP.
  • Режим внедрения методов AOP.
  • Режим свойств 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

Режим внедрения методов AOP:

<?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), то исходный метод не выполняется и теряется.

  • Закрытый обход AOP:
Xaop::addAroundAop(Xaop::class, "getXaop", function($resCode){
  echo 'Before';
  Xaop::exec($resCode); // Если эта строка не выполнена, исходный метод не будет выполнен и будет потерян
  echo 'After';
});
  • Метод класса обхода AOP:
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>';
});

2. Режим свойств AOP:

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

3. Режим документирования на основе вызовов объектов:

<?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 )

Вы можете оставить комментарий после Вход в систему

Введение

Поддерживает три режима работы AOP-фреймворк, компенсирует недостатки PHP и имеет встроенную библиотеку для анализа документации. Можно использовать вместе, производительность отличная. Приглашаем STAR и FORK. Развернуть Свернуть
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/josinli-xaop.git
git@api.gitlife.ru:oschina-mirror/josinli-xaop.git
oschina-mirror
josinli-xaop
josinli-xaop
master