如何在 PHP 中提取属性声明的起始行?

Mic*_*ael 5 php reflection properties

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

Gor*_*don 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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