PHP: Проверка кода, так как PHP - свободный тип / динамический язык? - PullRequest
0 голосов
/ 26 июля 2010

У меня есть небольшое веб-приложение на 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;

UPDATE

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

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

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

ОБНОВЛЕНИЕ 2

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

Ответы [ 8 ]

10 голосов
/ 26 июля 2010

Вы можете lint ваш 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.

4 голосов
/ 26 июля 2010

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

Неинициализированные переменные ошибки времени выполнения (уровня 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 перед его использованием, вы можете избежать или уменьшить проблема неинициализированных переменных.

Ресурсы

4 голосов
/ 26 июля 2010

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

См:

http://us2.php.net/manual/en/errorfunc.configuration.php#ini.error-reporting

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

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

0 голосов
/ 26 июля 2010

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

0 голосов
/ 26 июля 2010

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

php -l path/to/file.php

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

0 голосов
/ 26 июля 2010

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

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

...