Как я могу выполнить статический анализ кода в PHP?

Есть ли инструмент статического анализа исходных файлов PHP?

Сам двоичный файл может проверять синтаксические ошибки, но я ищу что-то, что делает больше, например:

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

Связанный веб-сайт: Набор инструментов обеспечения качества PHP (phpqatools.org) и еще один статический инструмент - PHP_CompatInfo.

hakre 25.12.2013 21:12

Righty-o: закрыто SO, когда ясно, что такой ответ невероятно полезен.

Ira Baxter 06.08.2014 14:35

дать согласие. Это очень важный вопрос. php lint (php -l file) не может предоставить вторую половину: запустите автозагрузку, убедитесь, что вызываемая функция существует, переменные существуют, свойства объекта существуют. и т.п.

Max 07.11.2014 21:03

Phan (для php-7) имеет только что был выпущен.

kojiro 08.12.2015 19:09

@IraBaxter полезно, но, строго говоря, не по теме. softwarerecs.stackexchange.com, вероятно, более тематическое место. Конечно, ирония в том, что с SO знаком гораздо больше разработчиков, чем с его родным братом ...

Wayne Werner 08.12.2015 19:51

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

eswald 08.12.2015 20:12

Закрыто из-за доводчиков, работающих на спусковой крючок. Ба!

Roadowl 24.11.2016 21:30

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

pppery 21.06.2020 03:13
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
474
8
147 707
12
Перейти к ответу Данный вопрос помечен как решенный

Ответы 12

Онлайн PHP lint

PHPLint

Проверка унифицированных переменных. Хотя ссылки 1 и 2 уже, кажется, справляются с этим нормально.

Я не могу сказать, что интенсивно использовал что-либо из этого :)

Его ответ сделал мой день отличным! +1

Guilherme Nascimento 03.05.2014 02:41
Ответ принят как подходящий

Запустите php в режиме lint из командной строки, чтобы проверить синтаксис без выполнения:

php -l FILENAME

Статические анализаторы более высокого уровня включают:

К анализаторам нижнего уровня относятся:

Анализаторы времени выполнения, которые более полезны для некоторых вещей из-за динамической природы PHP, включают:

Библиотеки документации phpdoc и Doxygen выполняют своего рода анализ кода. Doxygen, например, можно настроить для визуализации хороших графов наследования с помощью Графвиз.

Другой вариант - xhprof, который похож на Xdebug, но легче, что делает его подходящим для производственных серверов. Инструмент включает интерфейс на основе PHP.

PHP_CodeSniffer прост в установке и использовании. :)

mcandre 01.08.2011 05:30

Я знаю, что это ответ на вопрос, но все же при использовании php -l вот так: find /your/path -name '*.php' | xargs -r php -l не работает надежно. Часто пропускает файлы с синтаксическими ошибками в них.

dimitarvp 24.08.2011 14:38

PHP_CodeSniffer вначале выглядел мне очень хорошо, но я не мог, хоть убей, заставить его НЕ отображать «ошибки» отступов. Похоже, он полностью игнорирует опцию --error-severity.

dimitarvp 24.08.2011 14:51

+1 за то, что потратил 6 часов своей жизни на то, чтобы попробовать все эти вкусности!

Abe Petrillo 13.02.2012 22:48

@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

Joe 06.04.2012 02:07

xdebug и xhprof не являются инструментами статического анализа.

Ira Baxter 09.05.2012 03:11

@ira Я сделал предваряю их упоминание, называя их «параметрами анализа времени выполнения», но, может быть, мне следовало быть более точным?

troelskn 09.05.2012 12:10
find /your/path -name '*.php' -exec php -l {} \; работает надежно.
Koen. 08.08.2012 17:11

Если вы загружаете много расширений в свой стандартный php.ini, это может ускорить работу, если вы используете php -n -l filename.php, чтобы он использовал встроенные значения по умолчанию для настроек ini при выполнении проверок большого набора файлов.

Joeri Sebrechts 06.05.2013 16:31
NB: Чтобы встроенная функция lint (php -l) работала, вы должны установить display_errors = on в php.ini, иначе вы получите только общее сообщение о наличии синтаксических ошибок, но без подробностей о том, какие ошибки или какие строки .
Synetech 14.07.2013 08:15

Synetech - Хороший. Однако вы можете переопределить настройку в командной строке, используя переключатель -d. Например. php -l -d display_errors=on $FILENAME

troelskn 15.07.2013 00:10

@dimitko, я согласен с вашей оценкой PHP_CodeSniffer. С одним дополнением. Он был очень хорош в обнаружении всех моих ошибок отступов (по крайней мере, я так думал, в большинстве случаев я не соглашался), но на самом деле он не смог обнаружить фактические ошибки, которые я вставил в свой код для его проверки.

A.Grandt 13.11.2013 10:00

Еще мне нравится Средство для исправления стандартов кодирования SensioLab. Это сравнивается с ПСР-1 и ПСР-2. Что приятно, так это то, что он может автоматически исправлять файлы (но если вы просто хотите, чтобы он перечислял файлы с ошибками, используйте опцию --dry-run).

Sam 08.10.2014 17:50

Итак, лучший способ сканировать каталог с помощью кода с использованием 8 процессов - это примерно так - find . -name "*.php" -print0 | xargs -0 -n1 -P8 php -l

Oleg Abrazhaev 19.02.2016 10:23

SonarQube и плагин SonarLint упрощают работу

Anfelipe 13.06.2018 17:33

Есть ли способ заставить ТАК снова открыть этот вопрос? Ответы - это сильно устаревшая информация.

j4k3 19.01.2019 10:21

Извините за некропостинг, но для проверки синтаксических ошибок на CI / CD в автоматизации важно, чтобы код состояния команды при выходе был ненулевым при тестировании нескольких файлов. Для этой цели я использовал следующую команду: (find . -not -path "./vendor/*" -name \*.php -exec echo "php -l -d display_errors=on '{}' &&" \; ; echo "echo Done") | sh - , это создаст временный скрипт с объединением всех проверок линта с оператором оболочки '&&', который выдаст ненулевой код выхода в случае ошибки в любом файле.

Dmitry Valetin 04.10.2019 14:34

Мой любимый - Псалом (psalm.dev).

Zeal 27.01.2021 08:10

Для полноты - также проверьте phpCallGraph.

PHP PMD (детектор ошибок программирования) и PHP CPD (детектор копирования / вставки) как бывшая часть PHPUnit.

См. CloneDR семантических дизайнов, инструмент "обнаружения клонов", который находит скопированный / вставленный / отредактированный код.

Он найдет точные и близкие к пропаданию фрагменты кода, несмотря на пробелы, комментарии и даже переименование переменных. Образец отчета об обнаружении PHP можно найти на веб-сайте. (Я автор.)

Глядя на сайт, это кажется невероятным инструментом. Позже я посмотрю поближе! Спасибо за ссылку (+1 и за «Я тоже автор»)

Eric Cope 29.10.2011 21:53

Проклятие любого коварного ученика.

wom 15.03.2012 22:55

Появился новый инструмент под названием nWire для PHP. Это плагин для исследования кода для Затмение PDT и Zend Studio 7.x. Он позволяет анализировать код PHP в реальном времени и предоставляет следующие инструменты:

  • Визуализация кода - интерактивное графическое представление компонентов и ассоциаций.
  • Навигация по коду - уникальное представление навигации показывает все ассоциации и работает с вами, пока вы пишете или читаете код.
  • Быстрый поиск - поиск по мере ввода методов, полей, файла и т. д.

это не ответ на вопрос. как ответ существуют netbeans и т. д.

Yosef 22.04.2011 16:25

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

Что на самом деле проверяет? Разве нет какого-нибудь инструмента командной строки, который действительно работает? Или это зашито?

Peter Mortensen 07.02.2021 19:53

Детектор сообщений PHP крутой и быстрый.

Спасибо! Искал офигенный. Фактически, я отказываюсь использовать что-либо, кроме классных инструментов. :)

Prof. Falken 20.03.2012 18:00

Это начало, и, похоже, это то, что использует Netbeans, но я бы не стал ему полностью доверять. Некоторые из его параметров просто странны («предупреждают» вас, если вы используете оператор else ??), и в его обнаружениях есть множество серьезных ошибок, на которые даже не было ответа от разработчиков: github.com/phpmd/phpmd/issues

NoBugs 16.03.2015 07:58

else добавляет цикломатическую сложность и часто может быть написан по-другому, чтобы избежать и else. например если (правда) {$ x = 1; } else {$ x = 2; } можно переписать: $ x = 2; если (правда) {$ x = 1; }

RichardAtHome 22.11.2017 14:34

Я пробовал использовать 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 08.06.2012 03:22

@eswald Теперь я конвертирую детектор php беспорядка (phpmd). Из всех инструментов, которые я пробовал до сих пор (сниффер кода php, scheck, php -l, phpmd), IMHO, phpmd лучше всего подходит для моего случая.

rjha94 08.06.2012 07:58

Вы знаете, где найти Шека?

George Katsanos 23.05.2013 17:52

@GeorgeKatsanos scheck является частью набора инструментов pfff. github.com/facebook/pfff

rjha94 24.05.2013 13:19

Scheck всегда выдает мне ошибку "php checker нужен файл графика". В большей части несуществующей документации нет примеров.

Robert Bruce 26.01.2016 03:37

Адски устанавливать все на Mac OS X.

Vladimir Vukanac 17.03.2019 22:58

@ Владимир Вуканац может быть задокументирован и опубликован для всех?

rjha94 18.03.2019 20:45

Есть инструмент для статического анализа кода под названием Анализатор PHP. PHP Analyzer теперь является устаревшим проектом, но вы по-прежнему можете получить к нему доступ в устаревшей ветке.

Среди многих типов статического анализа он также предоставляет базовые функции автоматического исправления, см. документация.

Вы можете попробовать скомпилировать с помощью Facebook Хип-хоп.

Он выполняет статический анализ всего проекта и может быть тем, что вы ищете.

Страница GitHub

Есть 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-кодом, отличным от ООП.

alexglue 29.08.2014 10:37

Другие вопросы по теме