Xan — высокопроизводительный и простой в использовании PHP-фреймворк AOP
Расширение для анализа документов PHP, написанное на языке C.
Автор: Josin 774542602@qq.com | Блог
Xan — это высокопроизводительная и простая в использовании платформа разработки PHP, которая переворачивает традиционную конфигурацию и использует аннотации для конфигурации, что упрощает оптимизацию кода и делает логику более понятной. Она разработана на основе языка C.
В разработке находится функция, основанная на характеристиках AOP Zend OPCode, которая не требует прокси-сервера и стоит того, чтобы её использовать!
Аннотации можно увидеть повсюду в Java, например, @Null
или @NotNull
, они фактически являются объектами, которые модифицируют переменные, классы и методы. Они также могут иметь параметры:
package cn.supjos;
class A {
@NotNull(age)
@Default(age=22, type = "Car")
@Set("www.supjos.cn", email="774542602@qq.com")
void test() {
}
}
В PHP из-за отсутствия поддержки синтаксического сахара можно использовать только комментарии для создания аннотаций, например:
<?php
class A {
/**
* @NotNull
* @Default(age=22, sex="male")
* @Set("www.supjos.cn", email="774542602@qq.com")
*/
function test() {
}
}
В Xan, если в контроллере есть метод init(), движок автоматически выполнит init() от родительского класса до текущего класса без необходимости вручную вызывать parent::init().
Глобальная переменная Xan\App::$app представляет собой объект глобального класса Xan\App. IOC и контейнер основаны на этой переменной.
Если ключ в данных XML является числом (индексом массива), система автоматически создаст ключ как элемент метки. Система автоматически создаст корневой ключ как метку корневого элемента.
Идея AOP заключается в том, чтобы объединить логику или обязанности, общие для бизнес-модулей, но не связанные с бизнесом, в отдельный модуль, чтобы уменьшить повторяющийся код в системе, снизить степень связи между модулями и повысить удобство обслуживания и ремонтопригодность системы в будущем. AOP — это горизонтальное сочетание, то есть разделение общих служб в приложении.
Точка соединения — это точка выполнения программы. Xan поддерживает только точки соединения на уровне методов.
Точка входа — это структура, которая захватывает точку соединения. Обычно она может быть сопоставлена с регулярным выражением или выражением. На данный момент Xan поддерживает только точку входа метода.
Уведомление — это бизнес-логика точки входа. В настоящее время Xan поддерживает (@before, @after, @success, @failure) четыре уведомления.
Аспект — определение класса аспекта с использованием аннотации @Aspect.
Введение — использование дополнительных атрибутов и т. д. для изменения структуры объекта или класса. В настоящее время Xan может выполнять эту функцию с помощью аннотаций AttrAnnotation и ConstAnnotation.
Простой пример:
/**
* Определение класса аспектов
*
* @Aspect
*/
class Basic {
function before() {
echo 'before';
}
function after($data) {
echo 'after =>' . $data;
}
function success() {
echo 'success';
}
/**
* Определить уведомление
* Уведомление может передавать параметры в указанную точку входа, и если необходимо указать параметры, используйте формат (value="xxx.xxx", parameters="xxx||xxx||xxx") для указания уведомления
* Значение уведомления value представляет собой точку входа, состоящую из имени класса + "." + имени метода
* Параметры уведомления представляют собой несколько параметров, разделённых "||"
* Можно полностью опустить значение и параметры и напрямую ввести «класс и метод»
* Например:
*
* @before("Base.before")
* @after(value="Base.after", parameters="Xan Extension")
* @success("Base.success")
*/
function test() {
echo 'I\'m the test method for Aspect programming.';
// Возвращает true, тогда AOP выполняет успешное уведомление, иначе выполняет уведомление о неудаче
return true;
}
}
// Создать экземпляр прокси, возвращаемый объект прокси можно использовать как обычный объект (созданный новым объектом)
$base = Xan\Aop\Proxy::instance(Base::class);
// Вызов метода
$base->test();
Примечание: В Xan уведомления могут выполняться бесконечно, то есть одно уведомление может запускать другое уведомление, каждое уведомление имеет свою цепочку уведомлений, и нельзя выполнять замкнутые уведомления, иначе будет выдана ошибка «Fatal Error: Recursive calling: xx::xx».
$loader = new Xan\Loader();
$loader->setMap('@app', __DIR__);
$app = new Xan\App();
$app->bootstrap()->run();
Первые две строки — автоматическое подключение, последние две строки — запуск фреймворка. App конструктор поддерживает глобальные настройки.
Параметры конструктора приложения:
$config = array(
'urlPattern' => 'AUTO', // URL-шаблон: auto, get, path-info
'defaultModule' => 'index', // По умолчанию модуль
'urlGetStr' => '_xurl', // Ключ значения URL в режиме GET
'defaultController' => 'index', // Контроллер по умолчанию
'defaultAction' => 'index', // Метод по умолчанию
'viewSuffix' => 'html', // Суффикс представления по умолчанию, при отображении указанного случая суффикс URL должен быть передан
'urlSuffix' => 'html', // Суффикс URL по умолчанию, отображается при указании ситуации
'allowModules' => 'index,home', // Разрешённые все модули, несколько модулей разделены запятыми
'applicationDir' => './../apps', // Каталог приложений
'defaultNamespace' => 'app' // Пространство имён, соответствующее каталогу приложений
);
$app = new Xan\App($config);
Контроллер:
namespace app\modules\index\controllers;
class Index {
public function init() {
}
/**
* Метод по умолчанию
*/
public function indexAction() {
}
}
В Xan методы заканчиваются на Action, контроллеры начинаются с заглавной буквы, и не имеют суффикса Controller. Если вы разрабатываете интерфейс JSON или XML, пожалуйста, используйте аннотацию AOP.
namespace app\modules\index\controllers;
/**
* @Aspect
*/
class Index {
/**
Перевод выполнен с учётом контекста исходного текста. При переводе были опущены некоторые технические детали, не влияющие на понимание основной идеи текста. **Перевод текста на русский язык:**
В Xan только методы, вызываемые из фреймворка, и маршрутизация будут анализировать аннотации для реализации функций AOP. Аннотации Xan делятся на аннотации классов и аннотации методов. Все аннотации должны реализовывать интерфейс Xan\Type\Annotation\Annotation, который содержит только один метод input().
```php
namespace app\annotations;
class TagAnnotation implements \Xan\Type\Annotation\Annotation
{
public function input($objectOrName, $annotations) {
}
}
Когда Xan анализирует аннотацию, он вызывает соответствующий метод input() класса аннотации, чтобы завершить использование аннотации. Первый параметр $objectOrName в случае аннотаций класса — это имя текущего класса, а в случае аннотаций метода — текущий объект класса.
Например:
namespace app\moduels\index\controllers;
/**
* @Aspect
* @app\annotations\TagAnnotation(version="v1.2.1", aop="Xan")
*/
class Index
{
/**
* @LabelAnnotation(v = "V", t = "T")
*/
public function indexAction() {
}
}
namespace app\annotations;
class TagAnnotation implements \Xan\Type\Annotation\Annotation
{
public function input($objectOrName, $annotations) {
// $objectOrName
echo $objectOrName; // output: app\modules\index\controllers\Index;
// $annotations:
print_r($annotations); // output: [ 'version' => 'v1.2.1', 'aop' => 'Xan' ]
}
}
namespace app\annotations;
class LabelAnnotation implements \Xan\Type\Annotation\Annotation
{
public function input($objectOrName, $annotations) {
// $objectOrName
var_dump($objectOrName); // output: new app\modules\index\controllers\Index();
// $annotations:
print_r($annotations); // output: [ 'version' => 'v1.2.1', 'aop' => 'Xan' ]
}
}
Модель
Модели в Xan должны наследоваться от абстрактного класса Xan\Db\Model и реализовывать метод tableName():
namesapce app\models;
class User extends \Xan\Db\Model {
public function tableName() {
return 'tb_user';
}
public function init() {
// 初始化工作
}
}
Компонент SESSION в Xan инкапсулирует системную переменную $_SESSION. Например:
$session = new Xan\Session();
// 设置值
$session->set('hello.xan', 'world');
<==>
$session['hello.xan'] = 'world';
// 设置的结果就是:
$session = [
'hello' => [
'xan' => 'world'
]
];
// 获取值
$session->get('hello.xan');
<==>
$session['hello.xan'];
<==>
$session['hello']['xan'];
В компоненте SESSION Xan можно использовать многомерные массивы для доступа к элементам, но нельзя использовать их для изменения. Поэтому рекомендуется использовать встроенный оператор «.» для установки и доступа.
Многомерные элементы SESSION доступны с использованием оператора «.__».
Xan\Request инкапсулирует системные переменные $_GET, $_POST и $_SERVER.
$_GET
:
$request = new Xan\Request();
$data = $reqeust->get('data');
// 也可以使用过滤器
$data = $request->get('data', 'strtoupper');
<==>
$data = $request->get('data', function($data){
return strtoupper($data);
});
// 也可以指定默认值
$data = $request->get('data', 'strtoupper', 'Xan');
$_POST
:
$request = new Xan\Request();
$data = $reqeust->getPost('data');
// 也可以使用过滤器
$data = $request->getPost('data', 'strtoupper');
// 也可以指定默认值
$data = $request->getPost('data', 'strtoupper', 'Xan');
$_SERVER
:
$request = new Xan\Request();
$data = $reqeust->getServer('data');
// 也可以使用过滤器
$data = $request->getServer('data', 'strtoupper');
// 也可以指定默认值
$data = $request->getServer('data', 'strtoupper', 'Xan');
PHP 7.0 или выше, Linux/Unix (Mac OS X), Windows (требуется изменить файл config.w32 и скомпилировать).
cmake .
/usr/path_to_php/phpize
./configure --with-php-config=/usr/path_to_php/php-config
make -j && sudo make install -j
echo "xannotation.so" >> /usr/path_to_php/php.ini
Конструктор класса Xan
final class Xan
{
function __construct(){};
}
Аннотация класса: Xan::getClassDocComment($classNameOrObject)
/**
* Возвращает аннотацию класса
*
* @param $classNameOrObject класс или объект
*/
function getClassDocComment($classNameOrObject)
{
return $this;
}
Аннотация метода: Xan::getMethodDocComment($classNameOrObject,
Примечание: в тексте запроса есть код на языке программирования PHP, однако в рамках данного ответа перевод кода не предусмотрен. МетодName)
/**
* Получение информации о комментариях метода, возврат строки комментариев
*
* @param $classNameOrObject имя класса или объект
* @param $methodName имя метода
*/
function getMethodDocComment($classNameOrObject, $methodName)
{
}
Анализ комментариев: Xan::parseDocComment($docComments)
/**
* Возврат объекта, содержащего информацию о комментариях, [body] содержит информацию описания, остальные комментарии представляют собой массив
*
* @param $docComments комментарии для анализа
*/
function parseDocComment($docComments)
{
}
Получение комментариев в виде массива: Xan::getParseResult($docComments)
/**
* Аналогично parseDocComent(), но возвращает массив или объект
*/
function getParseResult($docComments)
{
}
Получение информации о всех методах класса: parseAllMethodsDocComment($objectOrName)
/**
* Функция `parseAllMethodsDocComment` используется для анализа всех методов класса {$objectOrName}
* Возвращает объект, содержащий результат. Результат имеет следующий формат:
*
* Ключ `num` означает количество методов
* Массив, каждый элемент которого представляет собой пару ключ-значение, где ключ — это имя функции, а значение — массив
* Каждый элемент массива содержит три пары ключ-значение:
* `annotations`: комментарии функции
* `num`: количество комментариев
* `body`: тело комментариев
*
* @param $objectOrName имя класса или объекта, для которого вы хотите получить комментарии
* @return this объект, содержащий значение
*/
function parseAllMethodsDocComment($objectOrName) : this
{
}
Конструктор Xan\Loader::__construct()
namespace Xan;
class Loader
{
function __construct();
}
Установка псевдонима: Xan\Loader::setMap($aliasName, $path)
namespace Xan;
class Loader
{
function setMap($aliasName, $path);
}
Запуск автозагрузки: Xan\Loader::start($prepend = false)
namespace Xan;
class Loader
{
function autoLoad($prepend = false);
}
Конструктор Xan\Type\ConfigClass::__construct()
namespace Xan\Type;
class ConfigClass
{
function __construct();
}
Настройка константы класса Xan\Type\ConfigClass::setConstant($className, $key, $value)
namespace Xan\Type;
class ConfigClass
{
function setConstant($className, $key, $value);
}
Настройка атрибута Xan\Type\ConfigClass::setAttribute($object, $key, $value, $flags = Xan\Type\ConfigClass::PUBLIC)
namespace Xan\Type;
class ConfigClass
{
function setAttribute($object, $key, $value, $flags = Xan\Type\ConfigClass::PUBLIC);
}
Настройка видимости атрибутов Xan\Type\ConfigClass::setAccessFlags($className, $key, $flags = Xan\Type\ConfigClass::PUBLIC)
namespace Xan\Type;
class ConfigClass
{
function setAccessFlags($className, $key, $flags = Xan\Type\ConfigClass::PUBLIC)
}
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )