愚蠢的问题 - 我很惊讶这个人咬了我。为什么PHP中未定义的常量值为true?
测试用例:
<?php
if(WHATEVER_THIS_ISNT_DEFINED)
echo 'Huh?';
?>
上面的例子打印'嗯?'
非常感谢你的帮助! :)
答案 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.
}
?>
答案 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?';