Подтвердить что ты не робот

Почему константы undefined имеют значение true?

Глупый вопрос - я удивлен, что это укусило меня. Почему константы undefined в PHP имеют значение true?

Тестовый пример:

<?php
    if(WHATEVER_THIS_ISNT_DEFINED)
        echo 'Huh?';
?>

В приведенном выше примере печатается "Huh?"

Большое спасибо за вашу помощь!:)

4b9b3361

Ответ 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?';