空字符串与零的比较在 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
此代码在 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