Подтвердить что ты не робот

Проверка синтаксиса 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: Undefined: foo

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

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

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

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

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

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

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

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

ИЗМЕНИТЬ

Был один плакат, который предположил, что 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 предупреждения.

4b9b3361

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

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

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

Ответ 4

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

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

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

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

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

Дэвид

Ответ 5

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

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

Ответ 6

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

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

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

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