通过反射,很容易获得起始线和结束线,例如源文件中的方法:ReflectionFunctionAbstract::getFileName()
, ReflectionFunctionAbstract::getStartLine()
, ReflectionFunctionAbstract::getEndLine()
提供此功能。但是,这似乎不适用于属性。在类定义中至少提取属性声明的起始行和文件名的最佳方法是什么?
这不是微不足道的,但也不是太难。
您可以通过反射获取定义属性的类。从那里您可以获得文件名。然后,您所要做的就是标记文件并检查属性声明的行,或者简单地逐行检查文件并进行字符串匹配。
这是一种可能的方法:
$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;
}
}
这是一个演示以证明它有效 https://eval.in/43395
显然,上述解决方案假设属性以某种方式声明。它还假设每个文件有一个类。如果您不能确定情况是否如此,标记化是更好的选择。但这也更困难。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)