PHP: Проверка кода, так как PHP является свободным типом / динамическим языком?

У меня есть небольшое веб-приложение на PHP, которое начинает постепенно увеличиваться в размерах.

Я начинаю интересоваться управлением моей PHP-базы кода, учитывая, что PHP - слабо / слабо типизированный, динамический язык.

Как другие управляют своим кодом на основе слабо / слабо типизированных динамических языков?

Существуют ли предварительные парсеры для PHP, которые позволяют мне выполнять проверки моей базы кода для идентификации таких вещей, как показано ниже?

$var1 = 'data';
// vr1 doesn't exist, it's a typo of $var1, but PHP would allow for this and not complain
echo $vr1;

ОБНОВЛЕНИЕ:

Приведенный выше пример может быть не лучшим примером, но, по сути, я пытаюсь донести, что некоторые ошибки в динамически слабом типизированном языке будут обнаруживаться только тогда, когда код запускается в рабочем режиме в RUN TIME; в то время как некоторые из этих проблем обычно встречаются в строго типизированных статических языках во время COMPILE.

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

Таким образом, существует ли что-нибудь, где я могу выполнить свой код PHP через него, прежде чем перейти в рабочий режим, и этот препроцессор анализирует мой код, чтобы убедиться, что я использую только определенные переменные и т. Д. По сути, проверьте мой код на предмет проверки неалгоритмический тип использования. Например, не пытаясь выполнить алгебру на строке и т. Д.

ОБНОВЛЕНИЕ 2

Обратите внимание, что на этот вопрос до сих пор нет ответа, потому что я ищу способ идентифицировать эти типы неалгоритмических ошибок в PHP по типу "компиляции", а не по RUN TIME.

8 ответов

Вы можете связать свой PHP с php -l filename.php, Это покажет любые синтаксические ошибки. Есть IDE, которые будут задерживаться, пока вы пишете код. Те, кто обычно может также обнаружить проблемы, как показано в вашем вопросе в дополнение к линтингу.

Помимо этого, подумайте о написании UnitTests для своего кода, чтобы обеспечить функциональность, и посмотрите на http://phpqatools.org/ ряд других инструментов, которые могут помочь вам повысить качество кода.

Убедитесь, что у вас есть error_reporting(-1); установить во время разработки, чтобы включить все ошибки, кроме того, чтобы включить display_errors а также display_startup_errors в php.ini. Отключите последние два в вашей производственной системе, чтобы предотвратить раскрытие информации о сервере.

Редактировать после обновления: исходный код PHP компилируется на лету. Время компиляции PHP эффективно во время выполнения. Если вы хотите скомпилировать PHP, вы должны использовать Facebook HipHop.

Ошибки во время выполнения

Неинициализированные переменные - это ошибки времени выполнения (уровня E_NOTICE) в PHP, так что вы можете видеть их только во время выполнения. В приведенном вами примере может произойти ошибка, а может и нет, в зависимости от того, как выполняется код. Например, это может быть $vr1 определяется в условном include() это иногда включено, а иногда нет.

Кроме того, возможно динамическое создание переменных во время выполнения с использованием переменных переменных ($$var) так что опять $vr1 на самом деле может быть определено где-то. Если интерпретатору PHP не удалось выполнить допустимый синтаксис или выдали ошибки компилятора в допустимом синтаксисе, это было бы другой проблемой.

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

Ошибки компиляции E_PARSE, E_COMPILE_ERROR, или же E_COMPILE_WARNING (не смертельно) в PHP. К ним относятся такие вещи, как отсутствующие файлы, функции или классы, то есть попытки выполнить код, которого там нет - то, что PHP не может сделать. Если PHP сможет, он попробует.

Обнаружение и предотвращение

По крайней мере, вы должны убедиться, что в вашей среде разработки и тестирования все ошибки PHP включены в ini:

error_reporting = E_ALL|E_STRICT
display_errors = On

Или во время выполнения:

error_reporting(-1);

Самодисциплина

Несколько советов по работе с PHP, которые могут помочь:

  • Используйте функциональное программирование
  • Установить запах кода и написать чистый синтаксис
  • Сделайте свою собственную проверку типов (ООП и функциональное программирование могут сделать это проще)
  • Избегайте глобального охвата и include() управляющие структуры
  • Используйте интегрированную среду разработки со вспомогательными средствами для понимания кода, такими как Netbeans.

Например, в приведенном выше примере, если вам нужно передать переменную в функцию или метод, который проверяет, что параметр isset() или же !== null перед его использованием вы можете избежать или смягчить проблему неинициализированных переменных.

Ресурсы

PHP определенно будет жаловаться на это либо предупреждением, либо уведомлением, если вы правильно настроите директиву конфигурации error_reporting.

Увидеть:

http://us2.php.net/manual/en/errorfunc.configuration.php

Этот тип ошибки будет обнаружен, если вы установите максимальное количество сообщений об ошибках. Это даст уведомление, указывающее, что $vr1 не был установлен.

Вы можете установить сообщение об ошибке в файле php.ini или на отдельных страницах, используя функцию ini_set().

Вот еще один вопрос SO, посвященный инструментам анализа кода PHP.

  1. Hack - это статически типизированный язык, созданный Facebook, который, по сути, представляет собой PHP со многими добавленными и удаленными функциями.
  2. PhpStorm - это IDE, которая предоставляет "проверки", которые отлавливают многие вещи, которые могут быть обнаружены статической проверкой типов, например, неопределенная переменная в вашем примере.
  3. Я начал писать статическую проверку типов для PHP здесь на основе подсказок типа PHP7 и аннотаций PHPDoc. Я никогда не заканчивал это, но есть некоторые проходящие тесты, и дизайн пока кажется надежным.

Поскольку PHP обычно не рассматривается как отдельный процесс COMPILE, возможно, вы могли бы объяснить, в какой момент вы считаете свой код скомпилированным?

Самая близкая вещь - проверка lint php, но это больше проверка синтаксиса. Вы можете запустить lint из командной строки:

php -l path/to/file.php

Вы можете встроить это в свою систему хранилища файлов, настроив проверку перед фиксацией.

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