在 PHP 8 中,将空字符串与零进行比较会得到与以前版本不同的结果

Empty string comparison to zero gives different result in PHP 8 than in previous versions

提问人:user1179501 提问时间:2/3/2021 最后编辑:IMSoPuser1179501 更新时间:11/5/2021 访问量:1775

问:

这段代码在 PHP 8 中给出的结果与所有以前版本的 PHP 不同:

if ('' == 0)
  echo 'PHP '.phpversion().' says yes';
else
  echo 'PHP '.phpversion().' says no';


PHP 7.2.12 says yes
PHP 7.4.14 says yes
PHP 8.0.0 says no

这似乎是一个重大变化。这是怎么回事?

PHP 的 php-8

评论

4赞 misorude 2/3/2021
PHP RFC:更理智的字符串与数字比较

答:

6赞 IMSoP 2/4/2021 #1

你是对的,这是一个重大变化。

与任何版本升级一样,您可以在官方 PHP 手册中找到迁移到 PHP 8.0 的指南。如果单击“向后不兼容的更改”,您将看到此更改是该页面上的第一件事:

数字和非数字字符串之间的非严格比较现在通过将数字转换为字符串并比较字符串来工作。

除了下一句话中的示例外,还有一个前后比较表,其中包括您给出的确切示例:

比较:;以前:;后:0 == ""truefalse

如果代码依赖于旧行为,则需要更新它以更明确地说明预期的值。例如,以下所有功能都可以在所有版本的 PHP 中使用:

if ( $value === 0 || $value === "" ) { ... }
if ( (string)$zero === "" ) { ... }
if ( (int)$emptyString === 0 ) { ... }

有关更改的更多背景信息,您可以在此处阅读原始提案:PHP RFC:更理智的字符串与数字比较

评论

0赞 Raskul 3/7/2021
谢谢,你能解释一下这背后的逻辑吗?我认为这是不合逻辑的!!如果是假的,并且是假的,应该是,但它是......我不明白为什么?""00 == ""truefalse
2赞 IMSoP 3/7/2021
@SamRaskul 类型杂耍本质上是不对称的,因为它隐式地应用了有损转换:最明显的是,只有两个布尔值可供选择,所以很多东西会强制转换为 ,很多东西会强制转换为 。例如,两者都是真的;但成为真的将是疯狂的。算子是关于有用的,这是一个主观的事情,有时它会“猜错”;如果您想要合乎逻辑可靠,只需使用 ,并手动指定您想要的任何强制转换,如答案末尾所示。falsetrue1 == true2 == true1 == 2=====