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

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

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

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

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

与任何版本升级一样,您可以找到 a guide to Migrating to PHP 8.0 in the official PHP manual. If you click on Backward Incompatible Changes 您会看到此更改是该页面上的第一件事:

Non-strict comparisons between numbers and non-numeric strings now work by casting the number to string and comparing the strings.

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

Comparison: 0 == ""; Before: true; After: false

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

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

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