【问题标题】:Empty string comparison to zero gives different result in PHP 8 than in previous versions空字符串与零的比较在 PHP 8 中给出了与以前版本不同的结果
【发布时间】:2021-05-07 13:25:33
【问题描述】:

此代码在 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


【解决方案1】:

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

与任何版本升级一样,您可以在 PHP 官方手册中找到a guide to Migrating to PHP 8.0。如果您单击Backward Incompatible Changes,您将看到此更改是该页面上的第一件事:

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

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

比较:0 == "";之前:true;之后:false

如果您的代码依赖于旧行为,则需要对其进行更新以更明确地了解预期值。例如,以下所有功能都适用于所有版本的 PHP:

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

有关更改的更多背景信息,您可以在此处阅读原始提案:PHP RFC: Saner string to number comparisons

【讨论】:

  • 谢谢,你能解释一下这背后的逻辑吗?我觉得不合逻辑!!!如果"" 为假,0 为假,0 == "" 应该是true 但它是false...我不明白为什么?
  • @SamRaskul 类型杂耍本质上是不对称的,因为它隐含地应用有损转换:最明显的是,只有两个布尔值可供选择,所以很多东西会转换为false,还有很多的东西将投射到true。例如,1 == true2 == true 都是 true;但是让1 == 2 是真的将是疯狂的。 == 运算符是关于有用,这是一个主观的东西,有时它会“猜测”错误;如果您想成为逻辑可靠,只需使用===,并手动指定您想要的任何强制转换,如答案末尾所示。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-03
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
相关资源
最近更新 更多