【问题标题】:How to extract start line of a property declaration in PHP?如何在 PHP 中提取属性声明的起始行?
【发布时间】:2013-08-17 21:45:14
【问题描述】:

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

【问题讨论】:

  • 您有尝试过的示例吗?你试过什么?

标签: php reflection properties


【解决方案1】:

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

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

这是一种可能的方法:

$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;
    }
}

这是demo to show that it works

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

【讨论】:

  • 标记化是个好主意;然而,对我来说,这意味着绕圈子:我正在编写一个ply-like 解析器生成器,并且需要这个功能来实现标记器功能。这是一种引导问题,所以我可能会先使用您的解决方案,一旦解析器生成器工作,我将实施一个标记器解决方案。 :)
  • 在这种情况下,我会说先在这里检查:stackoverflow.com/questions/2093228/lex-and-yacc-in-php。您可能还对github.com/nikic/PHP-Parsergithub.com/scrutinizer-ci/php-analyzer 感兴趣
  • 在开始我自己的项目之前,我评估了几种现有的方法,发现没有一个是真正合适的。但是,ply 的工作方式给我留下了深刻的印象,因此我尝试将其应用于 php。
猜你喜欢
  • 1970-01-01
  • 2014-09-30
  • 2013-04-13
  • 2013-05-03
  • 1970-01-01
  • 1970-01-01
  • 2011-12-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多