Есть ли инструмент статического анализа исходных файлов PHP?
Сам двоичный файл может проверять синтаксические ошибки, но я ищу что-то, что делает больше, например:
Righty-o: закрыто SO, когда ясно, что такой ответ невероятно полезен.
дать согласие. Это очень важный вопрос. php lint (php -l file) не может предоставить вторую половину: запустите автозагрузку, убедитесь, что вызываемая функция существует, переменные существуют, свойства объекта существуют. и т.п.
Phan (для php-7) имеет только что был выпущен.
@IraBaxter полезно, но, строго говоря, не по теме. softwarerecs.stackexchange.com, вероятно, более тематическое место. Конечно, ирония в том, что с SO знаком гораздо больше разработчиков, чем с его родным братом ...
Тот факт, что так много людей находят этот тип вопросов полезным, вероятно, объясняет, почему сейчас существуют программные ресурсы. Это определенно казалось актуальным, когда это был единственный сайт обмена стеками. Теперь, когда для этого есть ясное место, имеет ли смысл мигрировать?
Закрыто из-за доводчиков, работающих на спусковой крючок. Ба!
Ни популярность, ни старость не освобождают вопрос от правил. И мы не «счастливы спусковым крючком»; нет никаких сомнений в том, что этот вопрос касается библиотеки, и что такой вопрос категорически не по теме. Вы просто заявляете, что «этот вопрос - специальный, поэтому его следует рассматривать по-другому», не указывая никаких фактических причин, по которым ваш вопрос заслуживает такой особой обработки.






Проверка унифицированных переменных. Хотя ссылки 1 и 2 уже, кажется, справляются с этим нормально.
Я не могу сказать, что интенсивно использовал что-либо из этого :)
Его ответ сделал мой день отличным! +1
Запустите php в режиме lint из командной строки, чтобы проверить синтаксис без выполнения:
php -l FILENAME
Статические анализаторы более высокого уровня включают:
К анализаторам нижнего уровня относятся:
Анализаторы времени выполнения, которые более полезны для некоторых вещей из-за динамической природы PHP, включают:
Библиотеки документации phpdoc и Doxygen выполняют своего рода анализ кода. Doxygen, например, можно настроить для визуализации хороших графов наследования с помощью Графвиз.
Другой вариант - xhprof, который похож на Xdebug, но легче, что делает его подходящим для производственных серверов. Инструмент включает интерфейс на основе PHP.
PHP_CodeSniffer прост в установке и использовании. :)
Я знаю, что это ответ на вопрос, но все же при использовании php -l вот так: find /your/path -name '*.php' | xargs -r php -l не работает надежно. Часто пропускает файлы с синтаксическими ошибками в них.
PHP_CodeSniffer вначале выглядел мне очень хорошо, но я не мог, хоть убей, заставить его НЕ отображать «ошибки» отступов. Похоже, он полностью игнорирует опцию --error-severity.
+1 за то, что потратил 6 часов своей жизни на то, чтобы попробовать все эти вкусности!
@dimitko: Это потому, что php -l может читать только один входной файл за раз (то есть он не будет работать, если вы используете php -l file1.php file2.php). Вместо этого вам нужно использовать опцию -n 1, которая указывает xargs использовать только одну строку ввода для каждого командного процесса. Вместо этого это заставит его запускать php -l file1.php, а затем php -l file2.php отдельно. В то же время вы можете использовать -P <n> для запуска "n" процессов за раз, чтобы распараллелить выполнение: find . -name '*.inc' -o -name '*.php' -print0 | xargs -0 -n1 -P10 php -l
xdebug и xhprof не являются инструментами статического анализа.
@ira Я сделал предваряю их упоминание, называя их «параметрами анализа времени выполнения», но, может быть, мне следовало быть более точным?
find /your/path -name '*.php' -exec php -l {} \; работает надежно.
Если вы загружаете много расширений в свой стандартный php.ini, это может ускорить работу, если вы используете php -n -l filename.php, чтобы он использовал встроенные значения по умолчанию для настроек ini при выполнении проверок большого набора файлов.
php -l) работала, вы должны установить display_errors = on в php.ini, иначе вы получите только общее сообщение о наличии синтаксических ошибок, но без подробностей о том, какие ошибки или какие строки .
Synetech - Хороший. Однако вы можете переопределить настройку в командной строке, используя переключатель -d. Например. php -l -d display_errors=on $FILENAME
@dimitko, я согласен с вашей оценкой PHP_CodeSniffer. С одним дополнением. Он был очень хорош в обнаружении всех моих ошибок отступов (по крайней мере, я так думал, в большинстве случаев я не соглашался), но на самом деле он не смог обнаружить фактические ошибки, которые я вставил в свой код для его проверки.
Еще мне нравится Средство для исправления стандартов кодирования SensioLab. Это сравнивается с ПСР-1 и ПСР-2. Что приятно, так это то, что он может автоматически исправлять файлы (но если вы просто хотите, чтобы он перечислял файлы с ошибками, используйте опцию --dry-run).
Итак, лучший способ сканировать каталог с помощью кода с использованием 8 процессов - это примерно так - find . -name "*.php" -print0 | xargs -0 -n1 -P8 php -l
SonarQube и плагин SonarLint упрощают работу
Есть ли способ заставить ТАК снова открыть этот вопрос? Ответы - это сильно устаревшая информация.
Извините за некропостинг, но для проверки синтаксических ошибок на CI / CD в автоматизации важно, чтобы код состояния команды при выходе был ненулевым при тестировании нескольких файлов. Для этой цели я использовал следующую команду: (find . -not -path "./vendor/*" -name \*.php -exec echo "php -l -d display_errors=on '{}' &&" \; ; echo "echo Done") | sh - , это создаст временный скрипт с объединением всех проверок линта с оператором оболочки '&&', который выдаст ненулевой код выхода в случае ошибки в любом файле.
Мой любимый - Псалом (psalm.dev).
Для полноты - также проверьте phpCallGraph.
См. CloneDR семантических дизайнов, инструмент "обнаружения клонов", который находит скопированный / вставленный / отредактированный код.
Он найдет точные и близкие к пропаданию фрагменты кода, несмотря на пробелы, комментарии и даже переименование переменных. Образец отчета об обнаружении PHP можно найти на веб-сайте. (Я автор.)
Глядя на сайт, это кажется невероятным инструментом. Позже я посмотрю поближе! Спасибо за ссылку (+1 и за «Я тоже автор»)
Проклятие любого коварного ученика.
Появился новый инструмент под названием nWire для PHP. Это плагин для исследования кода для Затмение PDT и Zend Studio 7.x. Он позволяет анализировать код PHP в реальном времени и предоставляет следующие инструменты:
это не ответ на вопрос. как ответ существуют netbeans и т. д.
IDE NetBeans проверяет синтаксические ошибки, неиспользуемые переменные и т. д. Это не автоматизировано, но отлично работает для малых и средних проектов.
Что на самом деле проверяет? Разве нет какого-нибудь инструмента командной строки, который действительно работает? Или это зашито?
Детектор сообщений PHP крутой и быстрый.
Спасибо! Искал офигенный. Фактически, я отказываюсь использовать что-либо, кроме классных инструментов. :)
Это начало, и, похоже, это то, что использует Netbeans, но я бы не стал ему полностью доверять. Некоторые из его параметров просто странны («предупреждают» вас, если вы используете оператор else ??), и в его обнаружениях есть множество серьезных ошибок, на которые даже не было ответа от разработчиков: github.com/phpmd/phpmd/issues
else добавляет цикломатическую сложность и часто может быть написан по-другому, чтобы избежать и else. например если (правда) {$ x = 1; } else {$ x = 2; } можно переписать: $ x = 2; если (правда) {$ x = 1; }
Я пробовал использовать php -l и пару других инструментов.
Однако, по моему опыту, лучший вариант (конечно, ваш пробег может отличаться) - схема набора инструментов pfff. Я слышал о pfff на Quora (Есть ли хороший инструмент PHP lint / статического анализа?).
Вы можете его скомпилировать и установить. Нет хороших пакетов (в моей системе Debian Linux Mint мне пришлось сначала установить зависимости libpcre3-dev, Ocaml, libcairo-dev, libgtk-3-dev и libgimp2.0-dev), но его стоит установить.
Результаты сообщаются как
$ ~/sw/pfff/scheck ~/code/github/sc/
login-now.php:7:4: CHECK: Unused Local variable $title
go-automatic.php:14:77: CHECK: Use of undeclared variable $goUrl.
Спасибо. Он продолжает жаловаться на наш динамический импорт, но его другие возможности пока выглядят неплохо. Мне также нужно было установить binutils-gold, а scheck нужно было установить по настраиваемому пути, но теперь он, похоже, работает.
@eswald Теперь я конвертирую детектор php беспорядка (phpmd). Из всех инструментов, которые я пробовал до сих пор (сниффер кода php, scheck, php -l, phpmd), IMHO, phpmd лучше всего подходит для моего случая.
Вы знаете, где найти Шека?
@GeorgeKatsanos scheck является частью набора инструментов pfff. github.com/facebook/pfff
Scheck всегда выдает мне ошибку "php checker нужен файл графика". В большей части несуществующей документации нет примеров.
Адски устанавливать все на Mac OS X.
@ Владимир Вуканац может быть задокументирован и опубликован для всех?
Есть инструмент для статического анализа кода под названием Анализатор PHP. PHP Analyzer теперь является устаревшим проектом, но вы по-прежнему можете получить к нему доступ в устаревшей ветке.
Среди многих типов статического анализа он также предоставляет базовые функции автоматического исправления, см. документация.
Вы можете попробовать скомпилировать с помощью Facebook Хип-хоп.
Он выполняет статический анализ всего проекта и может быть тем, что вы ищете.
Есть RIPS - Статический анализатор исходного кода на уязвимости в скриптах PHP.. Исходный код RIPS доступен по адресу SourceForge.
С сайта РИПС:
RIPS is a tool written in PHP to find vulnerabilities in PHP applications using static code analysis. By tokenizing and parsing all source code files RIPS is able to transform PHP source code into a program model and to detect sensitive sinks (potentially vulnerable functions) that can be tainted by userinput (influenced by a malicious user) during the program flow. Besides the structured output of found vulnerabilities RIPS also offers an integrated code audit framework for further manual analysis.
RIPS - это полумертвый проект, работающий только с php-кодом, отличным от ООП.
Связанный веб-сайт: Набор инструментов обеспечения качества PHP (phpqatools.org) и еще один статический инструмент - PHP_CompatInfo.