理解缩进的php语法检查器

时间:2014-09-06 12:16:18

标签: php syntax editor lint

考虑这个PHP脚本:

<?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

是否有一个用于php的工具,它足够智能分析我的缩进并告诉我实际问题是在第9行(或11,就此而言),而不是在脚本的末尾。

4 个答案:

答案 0 :(得分:2)

这种问题几乎无法解决。编译器会尽力告诉您发生错误的位置,但它无法正确执行。从本质上讲,它将继续扫描文件,直到它到达那个必须无效的东西;但这并不意味着你搞砸了。它只是意味着在你犯了错误的那一刻,接下来的东西仍然是技术上有效的语法(即使完全是愚蠢的),直到编译器厌恶地放弃。

所以在你的情况下,语法在第14行之前在技术上很好,即使代码偏离你在第9行的意图。解析器也不知道。

由于缩进是可选的并且被解析器忽略,因此它几乎肯定会比考虑缩进的麻烦更多。如果确实如此,那么在没有错误的情况下会不断出现错误。毕竟,缩进在语法上没有意义的一个后果就是有不止一种合理的缩进方式。

我认为,您最好的选择是使用自动为您添加缩进的IDE。 (Eclipse当然可以配置为你缩进缩进。)如果你这样做,你会发现,当你写第11行它想要缩进它比你期望的更多,这会给你一个线索,你忘记了一个闭合支撑。

答案 1 :(得分:1)

从技术上讲,这可能是可能的,而不是很难实现作为某些IDE的插件(Netbeans,PHP Storm,Eclipse,...) 但我不知道任何提供当前功能的插件或IDE。也许你可以自己实现它。

简单的实现就像是

  • 将代码拆分为行
  • 确定每行的缩进量
  • 关于缩进级别更改查找{
  • 案例1否{
    • =&GT;如果在下一行中有多个n + 1级别的标识 - 抛出警告
  • 案例2:{
    • 继续前进,直到下一个标识级别更改并查找}
    • 如果没有} =&gt;发出警告

此程序应称为递归

答案 2 :(得分:0)

我知道这在技术上没有回答这个问题,但我发现netbeans 中的语法突出显示有助于无法解决这个问题。

我现在不能没有它。

enter image description here

答案 3 :(得分: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
--------------------------------------------------------------------------------

第三条消息令人困惑,仍然比默认消息更接近问题的根源。