【问题标题】:PHP annotation - get absolute name of classesPHP注释 - 获取类的绝对名称
【发布时间】:2014-04-18 05:19:49
【问题描述】:

我正在解析几个方法的@returns phpdoc 注释。有没有办法以某种方式获得类的绝对名称?

例如:

namespace Y;

use X\A;

class B {

}

class C {
    /** @return A */
    public function getA(){}

    /** @return B */
    public function getB(){}
}

我需要这样的东西

array(
    'Y\C' => array(
        'getA' => array(
            'returns' => 'X\A'
        ),
        'getB' => array(
            'returns' => 'Y\B'
        )
    )
);

目前我有这个:

array(
    'Y\C' => array(
        'getA' => array(
            'return' => 'A'
        ),
        'getB' => array(
            'return' => 'B'
        )
    )
);

注意:我可以处理Y\B,因为我可以读取reflectionClass的命名空间,但是我不知道如何处理use语句......

【问题讨论】:

    标签: php class namespaces annotations phpdoc


    【解决方案1】:

    如果我是目前获取ReflectionClass::getFileName() 类文件的唯一解决方案,请解析use 标记并通过特征和继承解析其他文件。之后,您可以为该类创建一个别名映射,并使用该别名映射来获取我们在 @return 注释中描述的类或接口的绝对类名。比如Doctrine TokenParser就是通过这种方式获取use语句的实现...

    所以是的,可以获取别名,但是php中没有对注释的原生支持,所以这只是一种解决方法......

    一个简单的例子:

    use Doctrine\Common\Annotations\TokenParser;
    use ReflectionClass;
    
    function getAliases($className){
        $annotatedClass = new ReflectionClass($className);
        $namespace = $annotatedClass->getNamespaceName();
        $aliases = array();
        $classFile = $annotatedClass->getFileName();
        if ($classFile) {
            $classCode = file_get_contents($classFile);
            $tokenParser = new TokenParser($classCode);
            $aliases = $tokenParser->parseUseStatements($namespace);
        return $aliases;
    }
    

    返回

    array(
        strtolower($aliasName) => $className,
        ...
    )
    

    【讨论】:

    • 您是否尝试在返回标签中完全命名类名?
    • 不。这就是为什么我需要 TokenParser 通过类所在的文件来获取别名......顺便说一句。写这样一个解析器并不难,因为php有一个token_get_all函数...
    猜你喜欢
    • 2010-10-05
    • 1970-01-01
    • 1970-01-01
    • 2013-01-07
    • 1970-01-01
    • 2018-03-24
    • 2021-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多