此代码在 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)
这似乎是一个重大变化。这里发生了什么?
你是对的,这是一个重大改变。
与任何版本升级一样,您可以在官方 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