Глупый вопрос – я удивлен, что это укусило меня. Почему неопределенные константы в PHP оцениваются как истинные?
Прецедент:
<?php if(WHATEVER_THIS_ISNT_DEFINED) echo 'Huh?'; ?>
Вышеприведенный пример печатает «Да?»
Большое спасибо за Вашу помощь! 🙂
Попробуйте defined('WHATEVER_THIS_ISNT_DEFINED')
Когда PHP встречает константу, которая не определена, она выдает E_NOTICE
и использует имя константы, которое вы пытались использовать в качестве строки. Вот почему ваш отпечаток печатает Huh!
, потому что непустая строка (которая не является "0"
) будет оцениваться как true
.
Из руководства:
Если вы используете неопределенную константу, PHP предполагает, что вы имеете в виду имя самой константы, как если бы вы назвали ее строкой (CONSTANT vs «CONSTANT»). Когда это произойдет, выдается ошибка уровня E_NOTICE.
Если вы установите уровень отчетности об ошибках, чтобы сообщить E_NOTICE
s, что является хорошей практикой во время разработки, вы также увидите уведомление, которое было E_NOTICE
.
Из руководства:
Если вы используете неопределенную константу, 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
.
Неопределенные константы рассматриваются как строки PHP: docs . Принимая этот факт, подумайте об этом на английском языке:
If "WHATEVER_THIS_ISNT_DEFINED", then do something.
… логично, что это «правда» – вы ничего не сравниваете ни с чем другим.
Вот почему при выполнении утверждений лучше всего включать определенную оценку. Если вы проверяете значение false, поместите его в код: if (something === false)
vs if (something)
. Если вы проверяете, установлен ли он, используйте isset
и т. Д.
Кроме того, это подчеркивает важность разработки с уведомлением и предупреждениями. Ваш сервер отправит уведомление по этой проблеме:
Примечание: использование неопределенной константы MY_CONST – предполагается «MY_CONST» в some_script.php в строке 5
Включите уведомления и предупреждения для разработки, выключите их для производства. Может только помочь!
Попробуйте defined()
. Если он не определен, константа предполагает, что это просто текст.
Обратите внимание, что имя константы всегда должно указываться при определении.
например
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. } ?>
Это не просто константы, это гораздо более широкая проблема с механизмом синтаксического анализа PHP. (Вы должны видеть предупреждения в своих журналах.)
В PHP «голые слова», которые он не распознает, обычно трактуются как строки, которые, как представляется, не содержат их кавычек, а строки с ненулевой длиной имеют тенденцию оценивать значение true .
Попробуй это:
$x = thisisatest ; $y = "thisisatest"; if($x == $y){ echo("They are the same"); }
Вы должны увидеть «Они одинаковые».