Проверка синтаксиса PHP с использованием предварительного источника

Ссылаясь на Есть ли статический анализатор кода [как Lint] для файлов PHP? – Я рассматриваю, как оценивать содержимое файлов PHP до того, как они будут созданы разработчиками. Независимо от того, какое решение (ы) уместно, будет вызвано с помощью SVN-крючков, аналогичных ответу: можно ли проверить PHP-синтаксис 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, который был непроверенным или несовместим.

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

  • php -l
    • не уведомляет о проблеме с $foo
  • phplint-pure-c-1.0_20110223 – PHPLint
    • не уведомляет о проблеме с $foo
  if ($foo == 'bar') { \_ HERE 

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

  • phps – PHP Code Sniffer
    • не уведомляет о проблеме с $foo несмотря на то, что PHP Sanity Check указывает, что это правильный ответ
  • SimpleTest
    • Очень приятно, но требует от разработчиков, которые пишут плохой код для написания хороших модульных тестов …

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

Оцените ввод / мысли по этой теме.

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

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

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

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

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

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

Я думаю, это может быть немного сложно для анализатора, чтобы давать предупреждения. Код, который вы указали, может работать с помощью 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 () он не обнаружил никаких проблем.

EDIT: так для этого другого теста:

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

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

Возможно, вы захотите объединить phpcs (придерживаться стандартов кодирования) и новый проект Себастьяна Бергмана: https://github.com/sebastianbergmann/hphpa. Он использует статический компилятор с помощью facebook для проверки ошибок, таких как поиск. Может быть слишком много, как крюк pre commit, но может быть достаточно крючка в вашей системе сборки?

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

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

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

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

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

Критический PHP-код / ​​PerlCritic для PHP?

(также google: perl crit для php)

Хотел бы я быть более конкретным, но иногда это просто идея, которая поможет вам решить проблему. Вот что я могу предложить 🙂

Дэвид

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

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

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

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

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

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