Ссылаясь на Есть ли статический анализатор кода [как 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, который был непроверенным или несовместим.
Из первой ссылки в этом вопросе я попытался:
$foo
$foo
if ($foo == 'bar') { \_ HERE
==== /mnt/hgfs/workspace/scratch-pad/phpinfo.php:44: Предупреждение: сравнение (неизвестно) == (строка): не удается проверить сравнение между неизвестными типами
$foo
несмотря на то, что PHP Sanity Check указывает, что это правильный ответ Все они интересны по-своему, но никто не улавливает эти проблемы, которые действительно находятся только во время работы.
Оцените ввод / мысли по этой теме.
РЕДАКТИРОВАТЬ
Был один плакат, который предположил, что 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».
Однако проблема с этими проверками заключается в том, что они не могут все знать, поэтому они иногда ошибаются на стороне «предложений» или «предупреждений», а не ошибок.
Тем не менее, он хорошо справляется с тем, что он делает, и это может вызвать такие проблемы во время редактирования и, как правило, это приводит к исправлению ошибок задолго до любого действия фиксации в любом случае.