为什么未定义的常量值为true?

时间:2011-06-01 20:06:58

标签: php constants

愚蠢的问题 - 我很惊讶这个人咬了我。为什么PHP中未定义的常量值为true?

测试用例:

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

上面的例子打印'嗯?'

非常感谢你的帮助! :)

7 个答案:

答案 0 :(得分:26)

尝试defined('WHATEVER_THIS_ISNT_DEFINED')

当PHP遇到未定义的常量时,它会抛出E_NOTICE,并使用您尝试用作字符串的常量名称。这就是为什么您的代码段打印Huh!,因为非空字符串(不是"0")将评估为true

从手册:

  

如果使用未定义的常量,PHP   假设你的意思是   恒定,就像你打电话一样   它作为一个字符串(CONSTANT vs   “不变”)。级别错误   E_NOTICE将在此时发布   发生的情况。

如果您将错误报告级别设置为报告E_NOTICE,这是开发过程中的一个好习惯,您还会看到引发的通知。

答案 1 :(得分:7)

从手册:

  

如果使用未定义的常量,PHP假定您指的是常量本身的名称,就像您将其称为字符串一样(CONSTANT vs“CONSTANT”)。

基本上,如果未定义WHATEVER_THIS_ISNT_DEFINED,PHP会将其解释为"WHATEVER_THIS_ISNT_DEFINED"。非空字符串的计算结果为true,因此您的表达式将始终通过(除非WHATEVER_THIS_ISNT_DEFINED 定义并设置为假值。)

坦率地说,这是愚蠢的行为。我相信,当程序员使用$foo[bar]时,我可以实现$foo['bar']之类的工作。像这样的不合逻辑的行为让人们认为PHP不是一种真正的编程语言。

测试是否定义常量的方法是使用defined

答案 2 :(得分:2)

未定义的常量被PHP视为字符串:docs。考虑到这一点,请用英语思考:

If "WHATEVER_THIS_ISNT_DEFINED", then do something.

......合乎逻辑的是它是“真实的” - 你没有比较任何事情。

这就是为什么在进行if语句时,最佳做法是包含特定的评估。如果您要检查错误,请将其放入代码中:if (something === false) vs if (something)。如果您要检查是否已设置,请使用isset,依此类推。

此外,这突出了启用通知和警告进行开发的重要性。您的服务器将针对此问题发出通知:

  

注意:使用未定义的常量   MY_CONST - 假设'MY_CONST'进入   第5行的some_script.php

打开通知和警告,将其关闭以进行生产。只能帮忙!

答案 3 :(得分:2)

试试defined()。如果它没有定义,则常量假设它只是文本。

答案 4 :(得分:1)

请注意,定义时必须始终引用常量名称。

e.g。

  • 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

答案 5 :(得分:0)

这不仅仅是常量,而是PHP解析引擎的一个更广泛问题。 (您应该在日志中看到警告。)

在PHP中,它无法识别的“裸字”通常被视为恰好缺少引号的字符串,以及长度为非{0}的字符串。

试试这个:

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

您应该看到“它们是相同的”。

答案 6 :(得分:0)

老问题,但是除了defined()之外,您还可以使用===

进行严格类型检查
<?php
if(WHATEVER_THIS_ISNT_DEFINED === true) // Or whatever type/value you are trying to check
    echo 'Huh?';