Php 为什么未定义的常量计算为true?

Php 为什么未定义的常量计算为true?,php,constants,Php,Constants,愚蠢的问题-我很惊讶这一个咬了我。为什么PHP中未定义的常量计算为true 测试用例: <?php if(WHATEVER_THIS_ISNT_DEFINED) echo 'Huh?'; ?> 上面的例子显示“嗯?” 非常感谢你的帮助!:) 试试defined('which\u THIS\u not\u defined') 当PHP遇到一个未定义的常量时,它抛出一个E_通知,并使用您尝试使用的常量名称作为字符串。这就是为什么你的代码片段会打印哈,因为非空

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

测试用例:

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

上面的例子显示“嗯?”

非常感谢你的帮助!:)

试试
defined('which\u THIS\u not\u defined')

当PHP遇到一个未定义的常量时,它抛出一个
E_通知
,并使用您尝试使用的常量名称作为字符串。这就是为什么你的代码片段会打印
,因为非空字符串(不是
“0”
)的计算结果将为
true

从手册中:

如果使用未定义的常量,PHP 假设您指的是 常量本身,就像你调用 它是一个字符串(常数vs “常数”)。水平误差 届时将发布E_通知 发生了

如果将错误报告级别设置为report
E_NOTICE
s,这在开发过程中是一个很好的做法,那么您还将看到抛出的通知


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

e、 g

  • 定义('MY_CONST','blah')
    -正确
  • 定义(MY_CONST,'blah')
    -不正确


看到这个警告:
“使用未定义的常量调试-假定为‘调试’”
更清晰的解决方法是使用

请参见

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

If "WHATEVER_THIS_ISNT_DEFINED", then do something.
。。。这是合乎逻辑的,它是“真实的”——你没有将任何东西与任何其他东西进行比较

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

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

注意:未定义常量的使用 我的常数-假设“我的常数” 第5行中的一些_script.php

打开要开发的通知和警告,关闭它们进行生产。我只能帮忙

试试看。如果未定义该常数,则该常数假定它只是文本。

来自手册:

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

基本上,如果没有定义
这个未定义的任何内容
,PHP将其解释为
“这个未定义的任何内容”
。非空字符串的计算结果为
true
,因此表达式将始终通过(除非定义了
此未定义的内容并将其设置为false值)

坦率地说,这是愚蠢的行为。我相信,它的实现是为了在程序员应该使用
$foo['bar]
的时候让类似
$foo[bar]
的东西工作。这种不合逻辑的行为让人们认为PHP不是真正的编程语言


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

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

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

试试这个:

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

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

旧问题,但是除了
定义()
之外,您还可以使用
=
进行严格的类型检查

<?php
if(WHATEVER_THIS_ISNT_DEFINED === true) // Or whatever type/value you are trying to check
    echo 'Huh?';

Wow,PHP又一次出人意料了。可能的原因:“因为它的评估结果不是假的”:)不,没有意外。警告解释了一切,“注意:在第5行的某些脚本.php中使用未定义的常量MY_CONST-假定为‘MY_CONST’”。在打开通知和警告的情况下开发!:)请记住为什么
“此未定义的内容”==TRUE
。您实际上需要定义
(“此未定义的内容”)
。如果没有引号,它会触发完全相同的通知错误。@Frank Thank,我正忙于改进我答案的其他部分:)。这不是一个更广泛的问题,它只适用于常量(基本上是裸词)。在您的示例中,
thisistest
是一个未定义的常量。常量使用大写字母只是一种命名约定。
<?php
if(WHATEVER_THIS_ISNT_DEFINED === true) // Or whatever type/value you are trying to check
    echo 'Huh?';