空字符串与零的比较在 PHP 8 中给出的结果与以前的版本不同

use*_*501 4 php php-8

此代码在 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
Run Code Online (Sandbox Code Playgroud)

这似乎是一个重大变化。这里发生了什么?

IMS*_*SoP 6

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

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

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

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

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

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

if ( $value === 0 || $value === "" ) { ... }
if ( (string)$zero === "" ) { ... }
if ( (int)$emptyString === 0 ) { ... }
Run Code Online (Sandbox Code Playgroud)

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

  • @SamRaskul 类型杂耍本质上是不对称的,因为它隐式地应用有损转换:最明显的是,只有两个布尔值可供选择,所以很多东西会转换为“false”,很多东西会转换为“true” 。例如,“1 == true”和“2 == true”都是 true;但让 `1 == 2` 为 true 将是疯狂的。`==` 运算符是为了_有用_,这是一个主观的事情,有时它会“猜测”错误;如果你想变得_逻辑_或_可靠_,只需使用`===`,并手动指定你想要的任何转换,如答案末尾所示。 (2认同)