Почему константы undefined имеют значение true?
Глупый вопрос - я удивлен, что это укусило меня. Почему константы undefined в PHP имеют значение true?
Тестовый пример:
<?php
if(WHATEVER_THIS_ISNT_DEFINED)
echo 'Huh?';
?>
В приведенном выше примере печатается "Huh?"
Большое спасибо за вашу помощь!:)
Ответы
Ответ 1
Попробуйте defined('WHATEVER_THIS_ISNT_DEFINED')
Когда PHP встречает константу, которая не определена, она выдает E_NOTICE
и использует имя константы, которое вы пытались использовать в качестве строки. Вот почему ваш фрагмент печатает Huh!
, потому что непустая строка (которая не является "0"
) будет оцениваться как true
.
Из руководства:
Если вы используете константу undefined, PHP предполагает, что вы имеете в виду имя самой постоянной, как если бы вы позвонили это как строка (CONSTANT vs "КОНСТАНТА" ). Ошибка уровня E_NOTICE будет выпущен, когда случается.
Если вы установите уровень отчетности об ошибках для отчета E_NOTICE
s, что является хорошей практикой во время разработки, вы также увидите уведомление, которое было отправлено.
Ответ 2
Из руководства:
Если вы используете константу undefined, PHP предполагает, что вы имеете в виду имя самой константы, как если бы вы назвали ее строкой (CONSTANT vs "CONSTANT" ).
В принципе, если WHATEVER_THIS_ISNT_DEFINED
не определен, PHP интерпретирует его как "WHATEVER_THIS_ISNT_DEFINED"
. Непустые строки оцениваются до true
, поэтому ваше выражение всегда будет проходить (если WHATEVER_THIS_ISNT_DEFINED
не определено и не задано значение false).
Это, откровенно говоря, глупое поведение. По-моему, было реализовано, чтобы такие вещи, как $foo[bar]
, работали, когда программист должен был использовать $foo['bar']
. Это нелогичное поведение, подобное этому, заставляет людей думать, что PHP - не настоящий язык программирования.
Способ проверки константы определяется с помощью defined
.
Ответ 3
Undefined константы рассматриваются как строки PHP: docs. Принимая этот факт, продумайте это на английском языке:
If "WHATEVER_THIS_ISNT_DEFINED", then do something.
... логично, что это "правда" - вы ничего не сравниваете ни с чем другим.
Вот почему при выполнении операторов if
лучше всего включать определенную оценку. Если вы проверяете значение false, поместите его в код: if (something === false)
vs if (something)
. Если вы проверяете, установлен ли он, используйте isset
и т.д.
Кроме того, это подчеркивает важность разработки с включенными уведомлениями и предупреждениями. Ваш сервер отправит уведомление по этой проблеме:
Примечание: использование константы undefinedMY_CONST - предполагается "MY_CONST" в some_script.php в строке 5
Включите уведомления и предупреждения для разработки, отключите их для производства. Может только помочь!
Ответ 4
Попробуйте defined()
. Если он не определен, то константа принимает его просто текст.
Ответ 5
Обратите внимание, что имя константы всегда должно указываться при определении.
например.
-
define('MY_CONST','blah')
- правильный
-
define(MY_CONST,'blah')
- неверно
и
<?php
if (DEBUG) {
// echo some sensitive data.
}
?>
and saw this warning:
"Use of undefined constant DEBUG - assumed 'DEBUG'"
A clearer workaround is to use
<?php
if (defined('DEBUG')) {
// echo some sensitive data.
}
?>
См. http://php.net/manual/en/language.constants.php
Ответ 6
Это не просто константы, это проблема более широкая с механизмом разбора PHP. (Вы должны видеть предупреждения в своих журналах.)
В PHP "голые слова", которые он не распознает, обычно трактуются как строки, которые не имеют котировок, а строки с ненулевой длиной имеют тенденцию оценивать до истины.
Попробуйте следующее:
$x = thisisatest ;
$y = "thisisatest";
if($x == $y){
echo("They are the same");
}
Вы должны увидеть "Они одинаковые".
Ответ 7
Старый вопрос, но в дополнение к defined()
вы также можете использовать строгую проверку типов, используя ===
<?php
if(WHATEVER_THIS_ISNT_DEFINED === true) // Or whatever type/value you are trying to check
echo 'Huh?';