【问题标题】:php syntax checker that understands indentation [closed]理解缩进的php语法检查器[关闭]
【发布时间】:2014-10-31 05:58:21
【问题描述】:

考虑这个 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 行,就此而言),而不是在脚本的末尾。

【问题讨论】:

  • 不太可能,因为缩进在 PHP 中没有实际意义......它有助于提高人类可读性,而不是机器可读性

标签: php syntax editor lint


【解决方案1】:

这种问题几乎是无法解决的。编译器会尽力告诉你错误发生在哪里,但它不能做到万无一失。本质上,它将继续扫描文件,直到它到达那个点必须是无效的东西;但这并不意味着这就是你搞砸的地方。这只是意味着在你犯错的那一刻,在编译器厌恶地放弃之前,所遵循的仍然是技术上有效的语法(即使完全愚蠢)。

因此,在您的情况下,直到第 14 行,语法在技术上都很好,即使代码偏离了您在第 9 行中的预期。解析器无法知道这一点。

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

我认为,您最好的选择是使用自动为您添加缩进的 IDE。 (Eclipse 当然可以配置为为您整理缩进。)如果您这样做,您会在编写第 11 行时发现它比您预期的要缩进更多,这会给您一个线索,您忘记了右括号。

【讨论】:

  • 没有什么“无法解决”的。检测这种错误的算法其实很简单(见 Philipp 的帖子)。
  • 好吧,也许我应该说,圆满解决它是不现实的。 PHP 中没有唯一的“正确”缩进策略,因此您最终会得到虚假的错误和警告,除非它被编码为与您的缩进策略精确配合。而且我怀疑在任何情况下都没有人完全符合他们自己的缩进政策!这就是为什么我认为最好在你写的时候有一些强制缩进的东西:它会更早地了解这些东西。
  • 我非常有信心我的缩进是正确的 ;)... 但是,一个好点,谢谢。也许我可以在 Idea 中使用“重新格式化代码”,看看哪里出了问题。
【解决方案2】:

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

简单的实现类似于

  • 将代码分成几行
  • 确定每一行的缩进
  • 在缩进级别更改时查找{
  • 案例1没有{
    • => 如果下一行中有多个级别为 n+1 的标识 - 抛出警告
  • 案例2:{
    • 继续前进直到下一个识别级别更改并寻找}
    • 如果没有} => 抛出警告

这个过程应该被称为递归

【讨论】:

    【解决方案3】:

    我知道这在技术上并不能回答问题,但我发现 netbeans 中的语法突出显示帮助解决了这个问题。

    我现在不能没有它。

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2010-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-26
        • 2014-10-17
        • 2023-03-06
        相关资源
        最近更新 更多