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
перед его использованием вы можете избежать или смягчить проблему неинициализированных переменных.
Ресурсы
- Операторы сравнения (см. Identity, в частности)
- Тип сравнения таблиц
is_int()
,is_float()
, так далее.
PHP определенно будет жаловаться на это либо предупреждением, либо уведомлением, если вы правильно настроите директиву конфигурации error_reporting.
Увидеть:
Этот тип ошибки будет обнаружен, если вы установите максимальное количество сообщений об ошибках. Это даст уведомление, указывающее, что $vr1 не был установлен.
Вы можете установить сообщение об ошибке в файле php.ini или на отдельных страницах, используя функцию ini_set().
Вот еще один вопрос SO, посвященный инструментам анализа кода PHP.
- Hack - это статически типизированный язык, созданный Facebook, который, по сути, представляет собой PHP со многими добавленными и удаленными функциями.
- PhpStorm - это IDE, которая предоставляет "проверки", которые отлавливают многие вещи, которые могут быть обнаружены статической проверкой типов, например, неопределенная переменная в вашем примере.
- Я начал писать статическую проверку типов для PHP здесь на основе подсказок типа PHP7 и аннотаций PHPDoc. Я никогда не заканчивал это, но есть некоторые проходящие тесты, и дизайн пока кажется надежным.
Поскольку PHP обычно не рассматривается как отдельный процесс COMPILE, возможно, вы могли бы объяснить, в какой момент вы считаете свой код скомпилированным?
Самая близкая вещь - проверка lint php, но это больше проверка синтаксиса. Вы можете запустить lint из командной строки:
php -l path/to/file.php
Вы можете встроить это в свою систему хранилища файлов, настроив проверку перед фиксацией.