Почему неопределенные константы оцениваются как истинные?

Глупый вопрос – я удивлен, что это укусило меня. Почему неопределенные константы в 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
  • определены ()
  • Кастинг в Boolean
  • Отчет об ошибках
  • Функция error_reporting ()

Из руководства:

Если вы используете неопределенную константу, 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. } ?> 

См. http://php.net/manual/en/language.constants.php

Это не просто константы, это гораздо более широкая проблема с механизмом синтаксического анализа PHP. (Вы должны видеть предупреждения в своих журналах.)

В PHP «голые слова», которые он не распознает, обычно трактуются как строки, которые, как представляется, не содержат их кавычек, а строки с ненулевой длиной имеют тенденцию оценивать значение true .

Попробуй это:

 $x = thisisatest ; $y = "thisisatest"; if($x == $y){ echo("They are the same"); } 

Вы должны увидеть «Они одинаковые».