Почему неопределенные константы имеют значение true? - PullRequest
19 голосов
/ 02 июня 2011

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

Контрольный пример:

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

Приведенный выше пример печатает «Ха?»

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

Ответы [ 7 ]

26 голосов
/ 02 июня 2011

Попробуйте defined('WHATEVER_THIS_ISNT_DEFINED')

Когда PHP встречает константу, которая не определена, он выдает E_NOTICE и использует имя константы, которое вы пытались использовать в качестве строки.Вот почему ваш фрагмент выводит Huh!, потому что непустая строка (которая не "0") будет иметь значение true.

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

Есливы используете неопределенную константу, PHP предполагает, что вы подразумеваете имя самой константы, как если бы вы называли ее как строку (CONSTANT vs "CONSTANT").В этом случае будет выдана ошибка уровня E_NOTICE.

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

7 голосов
/ 02 июня 2011

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

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

2 голосов
/ 02 июня 2011

Попробуйте defined(). Если он не определен, то константа предполагает, что это просто текст.

2 голосов
/ 02 июня 2011

Неопределенные константы обрабатываются PHP как строки: docs .Принимая этот факт, обдумайте это на английском языке:

If "WHATEVER_THIS_ISNT_DEFINED", then do something.

... логично, что это «правда» - вы не сравниваете ничего с чем-либо еще.

ЭтоВот почему при выполнении if утверждений рекомендуется включать конкретную оценку.Если вы проверяете на ложность, введите код: if (something === false) против if (something).Если вы проверяете, установлен ли он, используйте isset и т. Д.

Кроме того, это подчеркивает важность разработки с включенными уведомлениями и предупреждениями.Ваш сервер выдаст уведомление об этой проблеме:

Примечание: использование неопределенной константы MY_CONST - предполагается, что 'MY_CONST' в some_script.php в строке 5

Включить уведомленияи предупреждения для разработки, отключить их для производства.Могу только помочь!

1 голос
/ 02 июня 2011

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

, например

  • 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

0 голосов
/ 12 апреля 2019

Старый вопрос, но в дополнение к defined() вы также можете использовать строгую проверку типов, используя ===

<?php
if(WHATEVER_THIS_ISNT_DEFINED === true) // Or whatever type/value you are trying to check
    echo 'Huh?';
0 голосов
/ 02 июня 2011

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

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

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

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

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

...