PHP的Annotations之doctrine/annotations

昨天研究了很久的PHP的Annotation,对PHP平时最没有注意到的”注释”有了新的认识,不过虽然说也并不是非常流行的语言特性,不过在为我们实现一些特定操作的时候,或者说某些场景下还是有点用的。

今天就使用doctrine/annotations的Reader对象来做一些简单的操作,或是简单的入门。

具体步骤开始

安装doctrine/annotations

composer require doctrine/annotations

AnnotatedDescription.php

<?php
//该类是一个辅助类,几个属性$value $type $desc将用于描述其他类的属性、方法或者对象的。
/**
 * @Annotation
 */
class AnnotatedDescription
{
    public $value;
    public $type;
    public $desc;
}

index.php

<?php
//require自动加载文件
require 'vendor/autoload.php';
//require我们的Annotation描述类
require 'AnnotatedDescription.php';

/**
 * @AnnotatedDescription("这是一个用于展示Annotation类的例子。")
 */
class AnnotationDemo
{
    /**
     * @AnnotatedDescription(desc="这个属性必须要为String",type="String")
     * @var String
     */
    private $property = "I am a private property!";

    /**
     * @AnnotatedDescription(desc="不需要传入参数", type="getter")
     */
    public function getProperty()
    {
        return $this->property;
    }
}
echo "<pre>";
// Lets parse the annotations
use Doctrine\Common\Annotations\AnnotationReader;
$annotationReader = new AnnotationReader();
//Get class annotation
$reflectionClass = new ReflectionClass('AnnotationDemo');
$classAnnotations = $annotationReader->getClassAnnotations($reflectionClass);
echo "========= CLASS ANNOTATIONS =========" . PHP_EOL;
print_r($classAnnotations);


$annotationDemoObject = new AnnotationDemo();
$reflectionObject = new ReflectionObject($annotationDemoObject);
$objectAnnotations = $annotationReader->getClassAnnotations($reflectionObject);
echo "========= OBJECT ANNOTATIONS =========" . PHP_EOL;
print_r($objectAnnotations);


$reflectionProperty = new ReflectionProperty('AnnotationDemo', 'property');
$propertyAnnotations = $annotationReader->getPropertyAnnotations($reflectionProperty);
echo "=========   PROPERTY ANNOTATIONS =========" . PHP_EOL;
print_r($propertyAnnotations);


$reflectionMethod = new ReflectionMethod('AnnotationDemo', 'getProperty');
$methodAnnotations = $annotationReader->getMethodAnnotations($reflectionMethod);
echo "=========   Method ANNOTATIONS =========" . PHP_EOL;
print_r($methodAnnotations);

Output

========= CLASS ANNOTATIONS =========
Array
(
    [0] => AnnotatedDescription Object
        (
            [value] => 这是一个用于展示Annotation类的例子。
            [type] => 
            [desc] => 
        )

)
========= OBJECT ANNOTATIONS =========
Array
(
    [0] => AnnotatedDescription Object
        (
            [value] => 这是一个用于展示Annotation类的例子。
            [type] => 
            [desc] => 
        )

)
=========   PROPERTY ANNOTATIONS =========
Array
(
    [0] => AnnotatedDescription Object
        (
            [value] => 
            [type] => String
            [desc] => 这个属性必须要为String
        )

)
=========   Method ANNOTATIONS =========
Array
(
    [0] => AnnotatedDescription Object
        (
            [value] => 
            [type] => getter
            [desc] => 不需要传入参数
        )

)

综上
这个例子对于理解doctrine/annotation做的什么事会有一个比较简洁的介绍,当然也只是作为一个抛砖引玉的作用。

延伸阅读
Symfony2 & Doctrine Common: creating powerful annotations

参考网址
USING ANNOTATIONS IN PHP WITH DOCTRINE ANNOTATION READER

PHP的Annotations之doctrine/annotations

发表评论

电子邮件地址不会被公开。 必填项已用*标注