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