理解缩进的PHP语法检查器

3

Consider this php script:

<?php                       // 1
                            // 2
function foo() {            // 3
                            // 4
    $foo = 1;               // 5
                            // 6
    if("something") {       // 7
        $bar = 2;           // 8
                            // 9 = note the missing brace
                            // 10
    $baz = 4;               // 11
                            // 12
}                           // 13
?>                          // 14

当您运行它时,会出现解析错误。
 Parse error: syntax error, unexpected end of file in ... on line 14

有没有一种能够智能分析我的缩进并告诉我实际问题位于第9行(或第11行)而不是在脚本结尾的php工具?


2
不太可能,因为在PHP中缩进实际上没有任何意义...它只是为了方便人类阅读,而不是机器阅读。 - Mark Baker
4个回答

2
这种问题几乎是无法解决的。编译器会尽力告诉你错误发生的地方,但它不能百分之百正确。基本上,它会一直扫描文件,直到遇到必须在那个点无效的东西; 但这并不意味着你出错的地方就在那里。这只是意味着在你犯错的那个点,随后的内容仍然在技术上是有效的语法(即使完全愚蠢),直到编译器因为厌烦而放弃为止。
所以在你的情况下,直到第14行语法在技术上都是正确的,即使代码在第9行偏离了你的意图。解析器无法知道这一点。
由于缩进是可选的且被解析器忽略,如果它考虑缩进,它几乎肯定会造成更多麻烦。如果这样做,它会在没有错误的情况下不断出现错误。毕竟,缩进不具有语法上的意义,这意味着有多种合理的缩进方式。
我认为你最好的选择是使用自动为你添加缩进的IDE。 (Eclipse当然可以配置为为您解决缩进问题。)如果您这样做,您将发现在编写第11行时,它希望将其缩进得比您预期的多,这将为您提供一个提示,即您忘记了一个闭合括号。

这并不是什么“无法解决”的问题。检测这种错误的算法实际上非常简单(请参见Philipp的帖子)。 - georg
1
也许我应该说,解决这个问题是不现实的。在 PHP 中没有独特的“正确”缩进策略,所以,除非它被编码为精确地与您的缩进策略配合工作,否则你会遇到错误和警告。而且我怀疑没有人能始终如一地遵循他们自己的缩进策略!这就是为什么我认为最好有一些东西可以在您书写时强制执行缩进:它将更早地发现这些问题。 - chiastic-security
我非常有信心我的缩进是正确的 ;) ... 但还是一个好意见,谢谢。也许我可以在Idea中使用“重新格式化代码”,看看它在哪里出错了。 - georg

1
技术上讲,这是可能的,而且实现起来并不难,只需要作为某些IDE(如Netbeans、PHP Storm、Eclipse等)的插件即可。但我不知道目前有哪个插件或IDE提供这样的功能。也许你可以自己实现它。
简单的实现方式如下:
- 将代码分成行。 - 确定每行的缩进。 - 在缩进级别变化时查找 { 。 - 情况1:没有 {
如果下一行中有多个 n+1 级别的缩进,则抛出警告。
- 情况2:{
向前移动,直到下一个缩进级别变化,并查找 } 。
如果没有 } ,则抛出警告。
此过程应该被递归调用。

0

PHP_CodeSniffer在这里帮了点忙。这是它对于问题脚本的输出:

--------------------------------------------------------------------------------
FOUND 4 ERROR(S) AFFECTING 4 LINE(S)
--------------------------------------------------------------------------------
  2 | ERROR | Missing file doc comment
  3 | ERROR | Missing function doc comment
  8 | ERROR | Line indented incorrectly; expected 0 spaces, found 4
 22 | ERROR | Closing brace indented incorrectly; expected 4 spaces, found 0
--------------------------------------------------------------------------------

第三条信息有些混乱,但它比默认的信息更接近问题的源头。


0

我知道这并不是技术上的答案,但我发现 netbeans 中的语法高亮非常有助于解决这个问题。

现在我离不开它了。

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接