3

通过反射,很容易获得源文件中方法的开始和结束行,例如:ReflectionFunctionAbstract::getFileName(), ReflectionFunctionAbstract::getStartLine(),ReflectionFunctionAbstract::getEndLine()提供此功能。但是,这似乎不适用于属性。在类定义中至少提取属性声明的起始行和文件名的最佳方法是什么?

4

1 回答 1

3

这不是微不足道的,但也不是太难。

您可以通过反射获取定义属性的类。从那里你可以得到文件名。然后,您所要做的就是标记文件并检查属性声明的哪一行,或者简单地逐行遍历文件并进行字符串匹配。

这是一种可能的方法:

$reflector      = new ReflectionProperty('Foo', 'bar');
$declaringClass = $reflector->getDeclaringClass();
$classFile      = new SplFileObject($declaringClass->getFileName());

foreach ($classFile as $line => $content) {
    if (preg_match(
        '/
            (private|protected|public|var) # match visibility or var
            \s                             # followed 1 whitespace
            \$bar                          # followed by the var name $bar
        /x',
        $content)
    ) {
        echo $line + 1;
    }
}

这是一个演示,表明它有效

显然,上述解决方案假定要以某种方式声明属性。它还假设每个文件都有一个类。如果您不能确定是这种情况,则标记化是更好的选择。但这也更加困难。

于 2013-08-15T16:43:27.157 回答