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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (12)

我有以下一段代码:

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

它旨在将项目价格初始化为0,然后获取有关它的信息。如果价格被通知为'e',则意味着交易而不是卖出,由于它被存储在需要数字值的数据库中,所以用负值表示。

也有可能将价格保留为0,这可能是因为该项目是奖金,或者因为价格将在稍后时刻设置。

但是,总是当价格没有设置,并且初始值为0时,上面所示的if循环评估为真,价格设置为-1。也就是说,它认为0等于'e'。

这怎么解释?

提问于
用户回答回答于

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

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

由于第一个操作数是一个数字(0),第二个操作数是一个字符串('e'),该字符串也会转换为数字。字符串数据类型的手册页定义了如何完成字符串到数字的转换:

当在数值上下文中计算字符串时,结果值和类型按如下方式确定。 如果字符串不包含任何字符' .',' e'或' E',并且数值适合整数类型限制(由定义PHP_INT_MAX),则字符串将被评估为整数。在所有其他情况下,它将被评估为浮动。

在这种情况下,字符串是'e',因此它将被评估为一个浮点数:

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

由于'e'没有从有效的数字数据开始,它评估为浮动0

用户回答回答于

你正在做的==是为你分类的类型。

0是一个int,所以在这种情况下它将'e'转换为int。这是不能解析为一个,并将成为0。一串'0e'会变成0,并且会匹配!

使用 ===

扫码关注云+社区