PHP字符串比较不使用引号

7
据我所知,以下 PHP 语法不合法

if ($s == Yes)

应该改为以下方式编写:
if ($s == 'Yes')

然而,第一个示例可以正常工作。有人知道原因吗?

始终开启所有错误报告来开发PHP。所有不可见的通知会减慢您的应用程序,并使未禁用错误报告的其他人无法使用它。 - Lotus Notes
6个回答

14

一般情况下,它会被解释为一个常量,但如果PHP找不到该名称的常量,则假定其为字符串字面量,尽管没有引号。这将生成一个E_NOTICE消息(根据您的错误报告级别可能不可见);类似于:

注意:在script.php的第3行使用未定义的常量Yes-假定为“Yes”

基本上,PHP只是过于宽容。


8
简而言之,PHP会像引号存在一样处理字符串。
如果PHP无法识别某些内容作为保留标记,则将其视为字符串文字。
错误日志将显示有关此的警告。

1

你需要同时开启 error_reporting 显示通知和 display_errors。

error_reporting(E_ALL | E_STRICT);
ini_set('display_errors', '1');

if ($s == Yes) {
  // foo
}

1
第一个不是字符串。
而且它不能正常工作:
error_reporting(E_ALL);
if ($s == Yes) {}

这是一个遗留问题,来自于 PHP 刚开始只是一个“漂亮的主页”表单解释器的时代,而现在已经被强烈反对。


0
在 PHP 中,Yes 会被视为常量。如果该常量未定义,则会假定您指的是字符串 'Yes'。如果您已经打开了通知功能,它应该会生成一个通知。

0

当常量Yes未被定义时,PHP在内部将Yes转换为'Yes'。

顺便说一下.. 如果你想比较$s的值是否为字符串"Yes",那么你必须

a) 使用strcmp或 b) 使用身份运算符"==="


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接