Php 使用未定义的常量作为变量时的缺点

Php 使用未定义的常量作为变量时的缺点,php,constants,Php,Constants,嗯,不知道要搜索什么,所以不知道这是否是重复的 例如: function foo($bar){ switch($bar) case UNDEFINED: return 'foo'; break; case DEFINED: return 'bar'; break; default: return 'no foo and no bar';

嗯,不知道要搜索什么,所以不知道这是否是重复的

例如:

function foo($bar){
    switch($bar)
        case UNDEFINED:
            return 'foo';
        break;
        case DEFINED:
            return 'bar';
        break;
        default:
            return 'no foo and no bar';
    }
}

echo foo(DEFINED); # edited: had $ before function call
// bar

echo foo(OUTPUT);
// no foo and no bar

PHP(5.3版)不会抛出任何错误,但这有什么缺点吗?

未定义的常量被解释为字符串。在您的情况下,这将是两个字符串“已定义”和“未定义”。从PHP手册:

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

编辑忽略
E_通知
被认为是不好的风格,这来自PHP文档:

在开发期间启用E_通知 有一些好处。用于调试 用途:通知消息将发出警告 您需要了解代码中可能存在的错误。 例如,使用未赋值的值 被警告了。这是非常有用的 查找拼写错误并节省时间 调试。注意,消息将发出警告 你喜欢糟糕的风格。例如 $arr[item]最好写为 $arr['item']因为PHP试图处理 “项”作为常量。如果不是 常量,PHP假定它是字符串 数组的索引


这是怎么回事?我不认为这是做什么,你认为它做。定义值和未定义值的设置是什么?@Nathan,好吧,它确实起作用了,它也起作用了。@Tom这是什么?你的问题一点也不清楚。正如@spektom在下面所说的,如果您还没有定义这些常量,它将比较$bar==“未定义”和$bar==“已定义”。如果您已经定义了这些常量,那么它会将它们与您设置的任何值进行比较。它并不是检查它们是定义的还是未定义的,代码暗示了这一点(尽管我不确定您是否定义)。@Nathan,嗯,这些都没有定义(根本没有),因此它将它们转换为字符串,然后进行比较。基本上,临时常量表示不带$的变量。我说清楚了吗?spektom的答案到底描述了什么?你是否在其他地方定义了这些常数?除了注意到错误之外,没有其他缺点,我可以自由使用它?还是不推荐?啊,我明白了。。。基本上
foo(未定义的\u常量)
有点像
$array[UNQUOTED\u KEY]
?是的,在这两种情况下,PHP都会自动将未初始化的常量转换为字符串。