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;

ОБНОВЛЕНИЕ:

Приведенный выше пример может быть не лучшим примером, но, по сути, я пытаюсь передать то, что определенные ошибки в динамически слабом типизированном языке могут быть обнаружены только тогда, когда код запускается в производственной среде во ВРЕМЯ РАБОТЫ; тогда как некоторые из этих проблем обычно обнаруживаются в строго типизированных статических языках во время КОМПИЛЯЦИИ.

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

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

ОБНОВЛЕНИЕ 2

Обратите внимание, что на этот вопрос все еще нет ответа, потому что я ищу способ идентифицировать этот тип неалгоритмических ошибок в PHP по типу "компиляция", а не по ВРЕМЕНИ РАБОТЫ.


person Eric B    schedule 25.07.2010    source источник
comment
PHP - это интерпретируемый язык, а не компилируемый.   -  person dmp    schedule 26.07.2010
comment
Честно говоря, PHP - это беспорядок. С включениями, которые могут быть условными, и они сами могут включать в себя больше файлов, загрязненное пространство имен и множество других вещей, действительно трудно понять, будет ли определена переменная или нет, до времени выполнения.   -  person NullUserException    schedule 26.07.2010
comment
@Null Это действительно универсальная проблема среди языков программирования, которые могут условно включать файлы, что является важной особенностью PHP. Задача программиста - внести структуру в свое приложение.   -  person deceze♦    schedule 26.07.2010
comment
@Eric Единственные ошибки, не связанные с выполнением, PHP могут перехватить - это явные синтаксические ошибки. Все остальное нужно решать во время выполнения. Это требует другого стиля программирования, чем тот, который вы бы применили к чему-то вроде C. Если вы не можете привыкнуть к этому, вам не следует использовать PHP.   -  person deceze♦    schedule 26.07.2010
comment
Голосование отклонено из-за того, что спрашивающий настаивает на разделении времени выполнения и времени компиляции, хотя в PHP якобы нет разницы между ними. Прежде чем предъявлять требования, выучите язык, который вы используете.   -  person Ross Snyder    schedule 26.07.2010
comment
В духе исходного вопроса заменить компилятор инструментом анализа кода.   -  person cbednarski    schedule 26.07.2010
comment
@ Эрик, ты не найдешь лучшего ответа, чем тот, который тебе уже дал Гордон.   -  person jmz    schedule 27.07.2010


Ответы (8)


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

person Gordon    schedule 25.07.2010
comment
Написать UnitTest просто нереально. Посмотрите на мой пример выше, мне пришлось бы написать модульный тест почти для каждой строки кода, который у меня есть, если бы я сделал простую опечатку в имени переменной. - person Eric B; 26.07.2010
comment
@Eric Писать тесты почти для каждой строчки кода вполне нормально. Опечатка обычно где-то что-то ломает. Если у вас есть function add($var1, $var2) { return $vr1 + $var2; }, он не пройдет тестирование UnitTest, которое складывается из входных данных. - person Gordon; 26.07.2010
comment
@ Эрик Гордон прав. Если вы еще не начали модульное тестирование своего PHP-кода, вам следует. Сейчас. Поверьте, ваша жизнь станет намного проще. - person NullUserException; 26.07.2010
comment
Если вы считаете, что модульное тестирование нереалистично для вашего кода, то проблема в вашем коде, а не в модульном тестировании. Идея состоит в том, чтобы разбить ваш код на отдельные функции, цель которых - те, которые являются ссылочно прозрачными (при вводе a он всегда возвращает вывод b). Затем вы можете проверить, что каждая функция выполняет то, что должна делать. Если да, то либо опечаток нет, либо они не влияют на поведение функции. - person RHSeeger; 26.07.2010

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

Видеть:

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

person Ross Snyder    schedule 25.07.2010
comment
+1: не решает всех проблем, но, по крайней мере, улавливает некоторые проблемы, такие как несуществующие переменные или неопределенные индексы. - person ; 26.07.2010
comment
Однако меня беспокоит то, что он улавливает эту ошибку во ВРЕМЯ РАБОТЫ (во время производства). Эта ошибка должна быть обнаружена до того, как код будет запущен в производство. Подобные ошибки обычно обнаруживаются в компилируемых языках во время компиляции. - person Eric B; 26.07.2010
comment
@ bearmrider9, обратите внимание - мой исходный вопрос заключается в том, чтобы найти способ идентифицировать этот тип неалгоритмических ошибок во время COMPILE, а не RUNTIME. Таким образом, ваш ответ неприменим. - person Eric B; 26.07.2010
comment
поправьте меня, если я ошибаюсь, но php не интерпретируется, а не компилируется, как ASP.NET? - person studioromeo; 26.07.2010
comment
Да, с php COMPILE и RUNTIME - это одно и то же, потому что это интерпретируемый язык. - person xj9; 26.07.2010

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

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

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

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

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

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

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

error_reporting = E_ALL|E_STRICT
display_errors = On

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

error_reporting(-1);

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

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

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

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

Ресурсы

person cbednarski    schedule 26.07.2010

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

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

person bgcode    schedule 25.07.2010
comment
Но эта ошибка может быть обнаружена только во время РАБОТЫ. Как я могу заставить PHP сообщить мне об этой ошибке, что $ vr1 не определен во время COMPILE? - person Eric B; 26.07.2010

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

php -l path/to/file.php

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

person Ben Rowe    schedule 25.07.2010

Поскольку обычно считается, что PHP не проходит отдельный процесс КОМПИЛИРОВАНИЯ, возможно, вы могли бы объяснить, в какой момент вы считаете свой код СКОМПИЛИРОВАННЫМ?

person trowel    schedule 26.07.2010

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

person cbednarski    schedule 27.07.2010

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