PHP扩展实现Java注解_phpdoc-parser

这篇博客介绍了PHPdoc-parser扩展的开发背景,它是一个用于替代PHP中缺少注解语法的高性能分析器。作者通过C语言实现了一个PHP7.x的扩展,支持类、方法和变量的注解,并提供了简洁的API接口供开发者使用。文章详细展示了安装步骤、示例代码以及如何获取和解析注解信息。
摘要由CSDN通过智能技术生成

phpdoc-parser

开发此扩展的缘由在于昨天写 Spring 的时候发现注解是个好东西,可以简化很多的代码工作量,鉴于 PHP 没有注解的语法糖,所以只能开发一个扩展来替代,高性能的 PHP 注解分析器,基于 PHP7.x 开发的一个PHP扩展

An extension for PHP document parsing. written in C code.

何为注解?

在 Java 中到处可见注解的身影,如 @Null or @NotNull 等,其实注解就是一种修饰 变量、类、方法的对象,如下:

/**

* @NotNull

*/

class A

{

}

就表示使用 NotNull 注解来修饰 类 A,当然注解也可以携带参数:

class A

{

/**

* @NotNull(age)

* @Default(age=22, type = "Car")

* @Set("www.supjos.cn", email="774542602@qq.com")

*/

function test()

{

}

}

当前版本的 php-doc-comments 支持如上的三种形式的注解。下一个版本加入类初始化功能,使用指定的函数来初始化 注解 类

支持环境

>= PHP7.0

Linux/Unix(Mac OS X)

Windows version need to be changed the config.w32 file and compile, wish some one do the job instead of me.

安装

1: cmake(版本3.10),更改 CMakeLists.txt 中的 PHP 路径为您电脑PHP的路径,然后执行如下命令即可:

cmake .

2: phpconfigure

/usr/path_to_php/phpize

./configure --with-php-config=/usr/path_to_php/php-config

make -j && sudomake install -j

echo "xannotation.so" >> /usr/path_to_php/php.ini

使用示例

测试类 Hello

/**

* Class Hello * hello * world

*

* This is the first time to do the job for the annotation

* License: LGPL-v3

*

****This is the toast which need to be test the annotation.

*

* @type(name = "Hello", age = "world", good=fruit, info=www.supjos.cn)

* @version(value="v2.1.23", version="2323.23", name = "game")

*/

class Hello

{

/**

* 商品列表视图

*

* @Route("hello/world")

* @Method("vs", "value se"="hello", attr="private" )

*/

public function world()

{

}

/**

* 获取方法的注解信息,返回一个对象

*

* @NotEmpty("classNameOrObject", "methodName")

*/

function getMethodDocComment($classNameOrObject, $methodName)

{

}

/**

* 返回类的注解信息

*

* @NotEmpty("classNameOrObject")

*/

function getClassDocComment($classNameOrObject)

{

}

}

获取注解信息示例:

$xan = new Xan();

获取类的注解信息:

$docComments = $xan->getClassDocComment(Hello::class);

print_r($xan->getParseResult($docComments));

输出如下

Array

(

[annotations] => Array

(

[type] => Array

(

[name] => Hello

[age] => world

[good] => fruit

[info] => www.supjos.cn

)

[version] => Array

(

[value] => v2.1.23

[version] => 2323.23

[name] => game

)

)

[num] => 2

[body] => Class Hello * hello * world

This is the first time to do the job for the annotation

License: LGPL-v3

This is the toast which need to be test the annotation.

)

获取类方法的注解信息:

$docComments = $xan->getMethodDocComment(Hello::class, "world");

print_r($xan->getParseResult($docComments));

输出如下

Array

(

[annotations] => Array

(

[Route] => Array

(

[1] => hello/world

)

[method] => Array

(

[3] => vs

[value se] => hello

[yes] => fsdfls

)

)

[num] => 2

[body] => 商品列表视图

)

获取类的所有的方法的注解信息:

print_r($xan->parseAllMethodsDocComment(Hello::class));

输出如下

Xan Object

(

[num] => 3

[annotations] => Array

(

[world] => Array

(

[annotations] => Array

(

[Route] => Array

(

[1] => hello/world

)

[method] => Array

(

[3] => vs

[value se] => hello

[yes] => fsdfls

)

)

[num] => 2

[body] => 商品列表视图

)

[getMethodDocComment] => Array

(

[annotations] => Array

(

[NotEmpty] => Array

(

[2] => classNameOrObject

[3] => methodName

)

)

[num] => 1

[body] => 获取方法的注解信息,返回一个对象

)

[getClassDocComment] => Array

(

[annotations] => Array

(

[NotEmpty] => Array

(

[1] => classNameOrObject

)

)

[num] => 1

[body] => 返回类的注解信息

)

)

)

简洁的APIs

Xan 类构造函数

final class Xan

{

function __construct(){};

}

类注解: Xan::getClassDocComment($classNameOrObject)

/**

* 返回类的注解字符串

*

* @param $classNameOrObject 类名称或者对象

*/

function getClassDocComment($classNameOrObject)

{

return $this;

}

方法注解:Xan::getMethodDocComment($classNameOrObject, $methodName)

/**

* 获取方法的注解信息,返回注解字符串

*

* @param $classNameOrObject 类名称或者对象

* @param $methodName 方法名

*/

function getMethodDocComment($classNameOrObject, $methodName)

{

}

解析注解:Xan::parseDocComment($docComments)

/**

* 返回一个包含注解信息的对象,[body]包含的是说明信息,其余的注解每一个注解是一个数组

* 如:

*

 
 

* /**

* * @Route("hello/world")

* * @method("vs", "value se"="hello", yes="fsdfls" )

* */

* public function world()

* {

*

* }

*

* 那么返回结果如下:

*

 
 

* Array

* (

* [annotations] => Array

* (

* [Route] => Array

* (

* [1] => hello/world

* )

*

* [method] => Array

* (

* [3] => vs

* [value se] => hello

* [yes] => fsdfls

* )

*

* )

*

* [num] => 2

* [body] =>

* )

*

* @param $docComments 需要解析的注解信息

*/

function parseDocComment($docComments)

{

}

获取数组形式的注解:Xan::getParseResult($docComments)

/**

* 同 parseDocComent() 结果,区别在于返回的数组还是对象

*/

function getParseResult($docComments)

{

}

获取类的所有方法的注解信息:parseAllMethodsDocComment($objectOrName)

/**

* Function: `parseAllMethodsDocComment` used to parsing all methods which in class{$objectOrName}

* return the object contains the result, the result format like this:

*

 
 

* Xan Object

* (

* [num] => 3

* [annotations] => Array

* (

* [world] => Array

* (

* [annotations] => Array

* (

* [Route] => Array

* (

* [1] => hello/world

* )

*

* [method] => Array

* (

* [3] => vs

* [value se] => hello

* [yes] => fsdfls

* )

*

* )

*

* [num] => 2

* [body] =>

* )

*

* [getMethodDocComment] => Array

* (

* [annotations] =>

* [num] => 0

* [body] => 获取方法的注解信息,返回一个对象

* )

*

* [getClassDocComment] => Array

* (

* [annotations] =>

* [num] => 0

* [body] => 返回类的注解信息

* )

* )

* )

*

*

* The result contains the `num` key means the methods number

* the `annotations` key contains the result array, each key-value pair contains the key(The function name) & the value(array)

* each value contains three key-value pairs:

* `annotations`: The annotations the function contains

* `num` : The number of the annotations

* `body` : The body of the annotations

*

* @param $objectOrName The class name or object which you want to obtain the annotations

* @return this The object contains the value

*/

function parseAllMethodsDocComment($objectOrName) : this

{

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值