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

OSCHINA-MIRROR/josinli-phpdoc-parser

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

Xan — высокопроизводительный и простой в использовании PHP-фреймворк AOP

Расширение для анализа документов PHP, написанное на языке C.

Автор: Josin 774542602@qq.com | Блог

Xan — это высокопроизводительная и простая в использовании платформа разработки PHP, которая переворачивает традиционную конфигурацию и использует аннотации для конфигурации, что упрощает оптимизацию кода и делает логику более понятной. Она разработана на основе языка C.

В разработке находится функция, основанная на характеристиках AOP Zend OPCode, которая не требует прокси-сервера и стоит того, чтобы её использовать!

Особенности фреймворка:

  • PSR автоматическая загрузка;
  • Аннотации;
  • Программирование AOP;
  • IOC инверсия;
  • Эффективный механизм просмотра;
  • Высокоэффективные API-интерфейсы XML и JSON.

Что такое аннотации?

Аннотации можно увидеть повсюду в 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() {

    }
}

Описание функций

  1. В Xan, если в контроллере есть метод init(), движок автоматически выполнит init() от родительского класса до текущего класса без необходимости вручную вызывать parent::init().

  2. Глобальная переменная Xan\App::$app представляет собой объект глобального класса Xan\App. IOC и контейнер основаны на этой переменной.

  3. Если ключ в данных XML является числом (индексом массива), система автоматически создаст ключ как элемент метки. Система автоматически создаст корневой ключ как метку корневого элемента.

Идея AOP

Идея AOP заключается в том, чтобы объединить логику или обязанности, общие для бизнес-модулей, но не связанные с бизнесом, в отдельный модуль, чтобы уменьшить повторяющийся код в системе, снизить степень связи между модулями и повысить удобство обслуживания и ремонтопригодность системы в будущем. AOP — это горизонтальное сочетание, то есть разделение общих служб в приложении.

Важные понятия:

  1. Точка соединения — это точка выполнения программы. Xan поддерживает только точки соединения на уровне методов.

  2. Точка входа — это структура, которая захватывает точку соединения. Обычно она может быть сопоставлена с регулярным выражением или выражением. На данный момент Xan поддерживает только точку входа метода.

  3. Уведомление — это бизнес-логика точки входа. В настоящее время Xan поддерживает (@before, @after, @success, @failure) четыре уведомления.

  4. Аспект — определение класса аспекта с использованием аннотации @Aspect.

  5. Введение — использование дополнительных атрибутов и т. д. для изменения структуры объекта или класса. В настоящее время 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».

WEB-пример

    $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.

Аннотация 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

Компонент 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 доступны с использованием оператора «.__».

$_GET|$_POST|$_SERVER

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 и скомпилировать).

Установка

  1. CMake-установка: версия 3.10+ (достаточно вручную изменить файл CMakeLists.txt для пути PHP).

cmake .

  1. php-configure:
/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

Некоторые API

Аннотация Xan

Конструктор класса 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

Конструктор 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

Конструктор 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 )

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

Введение

Расширение для аннотаций PHP, которое упрощает анализ информации об аннотациях PHP. Развернуть Свернуть
Отмена

Обновления

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

Участники

все

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

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