средство проверки синтаксиса php, которое понимает отступы [закрыто]


Рассмотрим этот 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, если на то пошло), а не в конце сценария.

Author: Gumbo, 2014-09-06

4 answers

Такого рода проблемы в значительной степени неразрешимы. Компилятор сделает все возможное, чтобы сообщить вам, где произошла ошибка, но он не может сделать это безошибочно. По сути, он будет продолжать сканировать файл до тех пор, пока не достигнет чего-то, что в этот момент должно быть недействительным; но это не значит, что вы облажались. Это просто означает, что в тот момент, когда вы допустили ошибку, то, что последовало, все еще было технически допустимым синтаксисом (даже если совершенно глупо) до того момента, когда компилятор сдался в отвращение.

Таким образом, в вашем случае синтаксис технически исправен до строки 14, даже если код отклонился от того, что вы намеревались в строке 9. Парсер не может этого знать.

Поскольку отступ является необязательным и игнорируется синтаксическим анализатором, это почти наверняка вызовет больше проблем, чем стоило бы, чтобы он учитывал отступ. Если бы это было так, он продолжал бы выдавать ошибки там, где их не было. В конце концов, одно из следствий отступа не является синтаксически смысл в том, что существует более одного разумного способа сделать отступ.

Я думаю, что лучше всего было бы использовать IDE, которая автоматически добавляет отступ для вас. (Eclipse, безусловно, можно настроить для сортировки отступов для вас.) Если вы сделаете это, то при написании строки 11 вы обнаружите, что она хочет сделать отступ больше, чем вы ожидали, и это даст вам подсказку, что вы забыли закрывающую скобку.

 2
Author: chiastic-security, 2014-09-06 12:28:10

Технически это было бы удобно и не так сложно реализовать в качестве плагина для некоторых IDE (Netbeans, PHP Storm, Eclipse,...) Но я не знаю ни одного плагина или IDE, который в настоящее время предлагает такую функциональность. Может быть, вы сможете реализовать это самостоятельно.

Простая реализация была бы чем-то вроде

  • разделите свой код на строки
  • определите отступ для каждой строки
  • при изменении уровня отступа найдите {
  • случай 1 нет {
    • => если в следующих строках есть несколько идентификаторов уровня n+1 - выдайте предупреждение
  • случай 2: {
    • идите вперед до следующего изменения уровня идентификации и ищите }
    • если нет } => выдать предупреждение

Эту процедуру следует назвать рекурсивной

 1
Author: Philipp, 2014-09-06 12:31:34

Я знаю, что технически это не отвечает на вопрос, но я нахожу, что подсветка синтаксиса в netbeans помогает решить эту проблему.

Теперь я не мог жить без этого.

enter image description here

 0
Author: andrew, 2014-09-06 12:37:47

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

3-е сообщение сбивает с толку, но все же оно ближе к источнику проблемы, чем сообщение по умолчанию.

 0
Author: georg, 2014-09-06 14:11:59