PHP эквивалент «строгого использования» в Perl (для инициализации переменных перед использованием) - PullRequest
9 голосов
/ 18 сентября 2008

Соглашение Python заключается в том, что переменные создаются при первом присваивании, и попытка прочитать их значение до того, как один из них назначен, вызывает исключение. PHP, напротив, неявно создает переменную при чтении с нулевым значением. Это означает, что это легко сделать в PHP:

function mymodule_important_calculation() {
    $result = /* ... long and complex calculation ... */;
    return $resukt;
}

Эта функция всегда возвращает ноль, и если ноль является допустимым значением для функции, то ошибка может остаться незамеченной в течение некоторого времени. Эквивалент Python будет жаловаться, что переменная resukt используется до того, как она будет назначена.

Итак ... есть ли способ настроить PHP, чтобы он был более строгим с присвоением переменных?

Ответы [ 7 ]

10 голосов
/ 18 сентября 2008

PHP не делает много проверок вперед во время разбора.

Лучшее, что вы можете сделать, это повысить уровень предупреждения, чтобы сообщить о своих ошибках, но к тому времени, когда вы получите E_NOTICE, уже слишком поздно и уже невозможно заставить E_NOTICES появляться заранее.

Многие люди используют флаг error_reporting E_STRICT, но он все еще имеет обратную силу и не защитит вас от ошибок в коде, которые вы опубликовали.

Эта жемчужина появилась в списке рассылки php-dev на этой неделе, и я думаю, что это именно тот инструмент, который вам нужен. Это в большей степени проверка на ворс, но она добавляет область к текущей проверке ворса, которую делает PHP.

Проект Google, инициализированный PHP *

Есть надежда, что при небольшом внимании мы сможем реализовать это поведение в самом PHP. Так что поместите свои 2 цента в список рассылки PHP / системные запросы / сообщения об ошибках и посмотрите, сможем ли мы стимулировать его интеграцию.

4 голосов
/ 18 сентября 2008

Насколько я знаю, нет никакого способа заставить его выйти из строя, но с помощью E_NOTICE в настройках error_reporting вы можете заставить его выдать предупреждение (ну, уведомление :-) Но все же строку, которую вы можете искать).

1 голос
/ 18 сентября 2008

Проверить сообщения об ошибках, http://php.net/manual/en/function.error-reporting.php

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

0 голосов
/ 18 сентября 2008

Если вы используете «Анализ кода» для файлов или ваш проект в Zend Studio, он будет предупреждать вас о любых неинициализированных переменных (это фактически помогло найти тонну переменных с ошибками, скрывающихся в редко используемых частях кода, просто ожидающих вызова очень сложно обнаружить ошибки). Возможно, кто-то может добавить эту функциональность в функцию PHP lint (php -l), которая в настоящее время проверяет только синтаксические ошибки.

0 голосов
/ 18 сентября 2008

Есть что-то похожее: в PHP вы можете изменить уровень сообщений об ошибках. Лучше всего установить его на максимум в среде разработчика. Для этого:

Добавьте в свой PHP.ini:

error_reporting = E_ALL

Или вы можете просто добавить это вверху файла, над которым вы работаете:

error_reporting(E_ALL);

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

0 голосов
/ 18 сентября 2008

Вы можете попробовать поиграть с уровнем сообщения об ошибках, как указано здесь: http://us3.php.net/error_reporting, но я не уверен, что в нем упоминается использование неинициализированной переменной, даже с E_STRICT.

0 голосов
/ 18 сентября 2008

Я почти уверен, что он генерирует ошибку, если переменная не была ранее объявлена. Если в вашей установке такие ошибки не отображаются, проверьте уровень error_reporting () в файле php.ini.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...