Проверка синтаксиса PHP перед контролем исходного кода - PullRequest
34 голосов
/ 15 января 2012

Обращаясь к Существует ли статический анализатор кода [например, Lint] для файлов PHP? - Я смотрю, как оценить содержимое файлов PHP до того, как они будут переданы разработчиками. Какие бы ни были подходящие решения будут запущены через хуки SVN, подобные ответу: Можно ли проверить синтаксис PHP-файла из PHP?

Я сталкивался с этим Автоматическая проверка синтаксиса PHP-файлов при проверке SVN , под которым я иду, однако ... php -l недостаточно.

Например, с помощью кода:

if ($foo == 'bar') { 
     echo $foo;
}

В результате:

2012/01/15 02:51:14 [error] 694 #0: * 164 FastCGI отправлено в stderr: «Примечание PHP: Неопределенная переменная: foo

По сравнению с:

if (isset($foo)) { echo $foo; }

Часть этого сводится к обучению программистов передовым методам.К сожалению, некоторые не учатся так же быстро, как другие, и единственный способ обеспечить соответствие стандартам кодирования - это уменьшить количество непроверенных или несовместимых в SVN.

По первой ссылке в этом вопросе я попытался:

    if ($foo == 'bar') {
                     \_ HERE

==== /mnt/hgfs/workspace/scratch-pad/phpinfo.php:44: Предупреждение: сравнение (неизвестно) == (строка): невозможно проверить сравнение между неизвестными типами

  • phpcs - PHP Code Sniffer
    • не уведомляет о проблеме с $foo несмотря на PHP Sanity Check , указывающий, что это правильноответ
  • SimpleTest
    • Это очень приятно, но требует от разработчиков, которые пишут плохой код, писать хороший модультесты ...

Все они по-своему интересны, но никто не уловил этих проблем, которые действительно обнаруживаются только во время выполнения.

Цените вклад / мысли по этой теме.

РЕДАКТИРОВАТЬ

Был один постер, который предположил, что PHPLint - правильный путь.Я думал, хорошо!Давайте попробуем еще раз, учитывая, что есть новая версия: phplint-pure-c-1.1_20120202 :

 <?php
 if ($foo == 'bar') {
     echo $foo;
 }
 ?>

Простой тест .................... и, работает и выдает 1 ошибку, 1 предупреждение.Однако, если добавлено следующее BEFORE оператор if:

 <?php
 if (isset($foo) && $foo == 'bar') { echo 'man'; }
 if ($foo == 'bar') { 
     echo $foo;
 }
 ?>

, он не работает и выдает 0 ошибок, 2 предупреждения.

Ответы [ 6 ]

11 голосов
/ 15 января 2012

Я думаю, что анализатору может быть немного сложно выдавать предупреждения.Код, который вы дали , может работать, например, с помощью register_globals.Кроме того, это может быть определено в каком-то другом файле, который включает этот файл.По этим причинам файлы PHP должны анализироваться с полным контекстом других файлов, чтобы это было действительно надежно, и конфигурация PHP / сервера также должна быть либо доступна, либо определена для механизма анализа.

При этом выуверен, что phplint не делает то, что вы хотите?

Существует онлайн-валидатор , который вы можете использовать для его тестирования.Учитывая ввод:

<?php

echo $foo;

результат был:

        echo $foo;
                  \_ HERE
==== 3: ERROR: variable `$foo' has not been assigned
END parsing of test-qBlPWw
==== ?: notice: unused package `dummy.php'
==== ?: notice: unused module `standard'
Overall test results: 1 errors, 0 warnings.

, тогда как с isset () он не обнаружил никаких проблем.

РЕДАКТИРОВАТЬ: так для этогодругой тестовый пример:

<?php

if ($foo == 'bar') echo $foo;

В Linux Mint 8 ответом будет:

$ src/phplint test.php 
/home/vadmin/phplint/phplint-pure-c-1.0_20110223/test.php:3: ERROR: variable `$foo' has not been assigned
/home/vadmin/phplint/phplint-pure-c-1.0_20110223/test.php:3: Warning: comparing (unknown) == (string): cannot check the comparison between unknown types
Overall test results: 1 errors, 1 warnings.

, а при этом:

<?php

$foo = '1';
if ($foo == 1) echo $foo;

это:

$ src/phplint test.php 
/home/vadmin/phplint/phplint-pure-c-1.0_20110223/test.php:6: ERROR: comparing (string) == (int)
Overall test results: 1 errors, 0 warnings.

так не работает ли он должным образом и правильно ли сообщает о проблеме?

8 голосов
/ 07 февраля 2012

Возможно, вы захотите объединить phpcs (чтобы придерживаться стандартов кодирования) и новый проект Себастьяна Бергманна: https://github.com/sebastianbergmann/hphpa При этом используется статический компилятор от Facebook для проверки на наличие ошибок, таких как ваш поиск ... Возможно может быть слишком много, как хук предварительной фиксации, но может быть достаточно хука в вашей системе сборки?

5 голосов
/ 11 марта 2012

Все эти умные сверхмощные инструменты, которые подслушивают каждую дверь и заглядывают в каждую замочную скважину, никогда не смогут конкурировать с глупым и тупым действием ВЫПОЛНЕНИЯ кода.

Что такоеценность наличия скомпилированных, синтаксически правильных файлов php в репо?Вы можете создавать zound-файлы таких файлов, регулярно фиксировать их в репозитории и, будьте уверены, все они вносят свой вклад в проект и добавляют определенную надежную функцию, потому что, ну, они прошли предварительную зацепку для проверкиих достоверность?

Существует множество проблем с кодом, написанным людьми, синтаксис и отсутствующие переменные являются лишь верхушкой айсберга.Модульное тестирование (как отмечает @NikiC) очень помогает.Разработчик обязан сделать надежный, работающий, документированный код и проверить перед его фиксацией.Глупые ошибки использования необъявленных переменных - это то, на что может обратить внимание IDE (например, Zend Studio).Ваша цель состоит в том, чтобы создать хорошее работающее программное обеспечение и модульные тесты.Это должно быть главной проблемой на мой взгляд.Допустимые php-файлы - очень слабое требование ...

2 голосов
/ 02 февраля 2012

Не могли бы вы использовать сторонний компилятор, который имеет больше опций времени компиляции, например, phc (http://www.phpcompiler.org/doc/latest/runningphc.html#compiling-web-applications)? (Или, возможно, hiphop?)

Тогда я подумал: вам нужен Perl :: Critic дляphp.

Критиковать PHP-код / ​​PerlCritic для PHP?

(также Google: критика perl для php)

Хотелось бы быть ещеКонкретно полезно, но иногда это просто идея, которая приводит вас к решению. Это то, что я должен предложить:)

Дэвид

1 голос
/ 25 апреля 2012

Ах да, вам нужен PHPUnderControl!Он проверит ваш синтаксис, автоматически проверит ваши модульные тесты, выполнит индекс CRAP и многое другое.Это в основном бомба!

Проверьте это, вот URL: http://phpundercontrol.org/

0 голосов
/ 25 апреля 2012

хотя и не является средством проверки командной строки, PHPStorm должен быть одним из лучших IDE.

Он имеет различные проверки, которые могут обнаружить проблемы, о которых вы упоминали. Кроме того, он автоматически повторно запускает эти проверки для файлов, которые вы фиксируете для контроля версий, проверяя неопределенные переменные, некачественный код и «задачи».

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

Тем не менее, он довольно хорош в том, что делает, и может решать подобные проблемы во время редактирования и, как правило, приводит к исправлению ошибок задолго до любого действия коммита.

...