为什么 PHP 认为 0 等于字符串?

2022-08-30 07:03:53

我有以下代码:

$item['price'] = 0;
/* Code to get item information goes in here */
if($item['price'] == 'e') {
    $item['price'] = -1;
}

它旨在将项目价格初始化为 0,然后获取有关它的信息。如果价格被告知为“e”,则表示交易所而不是卖出,卖出作为负数存储在数据库中。

还有可能将价格保留为0,因为该物品是奖金,或者因为价格将在稍后设置。

但是,每当未设置价格(使其初始值为 0)时,上面指示的循环将计算为 true,并且价格设置为 -1。也就是说,它认为 0 等于“e”。if

这怎么能解释呢?

当价格显示为 0(初始化后)时,行为不稳定:有时 if 的计算结果为 true,有时它评估为 false。


答案 1

您正在为您整理类型。==

0是一个 int,所以在这种情况下,它将强制转换为一个 int。这是不可解析的,并且将成为.字符串将变为并且将匹配!'e'0'0e'0

===

PHP.net

使用 == 和其他非严格比较运算符的字符串和数字之间的比较目前的工作原理是将字符串转换为数字,然后对整数或浮点数执行比较。这导致了许多令人惊讶的比较结果,其中最值得注意的是0 == “foobar” 返回 true。

但是,此行为在 PHP 8.0 中已更改:

当与数字字符串进行比较时,PHP 8 使用数字比较。否则,它将数字转换为字符串并使用字符串比较。

7 菲律宾比索

0 == 'foobar' // true
0 == '' // true
4 == '4e' // true (4e is cast as a number and becomes 4)

PHP 8 在进行比较之前将数字转换为字符串

0 == 'foobar' // false
0 == '' // false
4 == '4e' // false ('4e' is considered non-numeric therefore 4 is cast as a string and becomes '4')

这是一个重大的更改,因此它是在一个新的主要PHP版本中实现的。此更改破坏了依赖于旧行为的脚本中的向后兼容性。


答案 2

这是由于 PHP 如何执行 == 比较运算符表示的比较操作

如果将数字与字符串进行比较,或者比较涉及数字字符串,则每个字符串将转换为一个数字,并以数字方式执行比较。[...]当比较时,不会发生类型转换,或者因为这涉及比较类型和值。===!==

由于第一个操作数是数字 (),第二个操作数是字符串 (),因此字符串也会转换为数字(另请参阅与各种类型的比较)。字符串数据类型的手册页定义了如何完成字符串到数字的转换0'e'

在数值上下文中计算字符串时,将按如下方式确定结果值和类型。

如果字符串不包含任何字符 ''、'' 或 '',并且数值符合整数类型限制(定义如下),则该字符串将计算为整数。在所有其他情况下,它将作为浮点数进行评估。.eEPHP_INT_MAX

在这种情况下,字符串是,因此它将被计算为浮点数:'e'

该值由字符串的初始部分给出。如果字符串以有效的数字数据开头,则这将是使用的值。否则,该值将为(零)。有效数值数据是可选符号,后跟一个或多个数字(可选包含小数点),后跟可选指数。指数是后跟一个或多个数字的“”或“”。0eE

由于不以有效的数值数据开头,因此计算结果为 float 。'e'0


推荐