这段代码在 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.0的指南。如果您单击向后不兼容的更改,您将看到此更改是该页面上的第一件事:
数字和非数字字符串之间的非严格比较现在通过将数字转换为字符串并比较字符串来工作。
除了下一句中的示例外,还有一个前后比较表,其中包含您给出的确切示例:
比较:
0 == ""
; 之前:true
; 后:false
如果您的代码依赖于旧行为,则需要对其进行更新以更明确地了解预期值。例如,以下所有功能都适用于所有版本的 PHP:
if ( $value === 0 || $value === "" ) { ... }
if ( (string)$zero === "" ) { ... }
if ( (int)$emptyString === 0 ) { ... }
有关更改的更多背景信息,您可以在此处阅读原始提案:PHP RFC: Saner string to number comparisons