为啥整数 0 等于 PHP 中的字符串? [复制]

Posted

技术标签:

【中文标题】为啥整数 0 等于 PHP 中的字符串? [复制]【英文标题】:Why is integer 0 equal to a string in PHP? [duplicate]为什么整数 0 等于 PHP 中的字符串? [复制] 【发布时间】:2012-12-07 21:03:02 【问题描述】:

可能重复:How do the equality (== double equals) and identity (=== triple equals) comparison operators differ?

为什么会这样

var_dump(0 == "string");

输出这个

bool(true)

== 运算符的上下文不是应该根据this set of rules 将0 转换为FALSE"string" 转换为TRUE 吗?

【问题讨论】:

试试===,我想它会给你错误的。 但即使作为比较,这也应该是错误的,不是吗? 解释这种行为:您正在比较一个整数和一个字符串。 php 将字符串转换为 int,即 0(因为它不包含任何数字表示)。 0 == 0 显然是正确的。 PHP 的第一条规则。学会不要对任何事情感到惊讶。 这组规则需要参考:php.net/manual/en/language.operators.comparison.php 【参考方案1】:
var_dump(0 == "string");

正在进行数字(整数)比较

0是整数,所以“string”转换成整数做比较,等于0的整数值,所以0 == 0为真

详情请参阅 PHP 文档中的comparison with various types table

【讨论】:

在 PHP 中一个非空字符串等价于整数 0 仍然很奇怪,这与 C 的概念冲突,而 PHP 声称受 C 的影响。在 C 中,非空 something 转换为 true 或等效整数 1 @Desmond 如果将"string" 转换为数字并且字符串不包含任何数值,则0 是唯一合乎逻辑的选择。如果您将"string" 转换为bool,它将转换为true,除非它为空(对于PHP 的“空”定义)。将"string" 转换为数字并得到1 一样不合逻辑,您只需要学习规则即可。 您好,请您解释一下为什么 filter_var(0, FILTER_VALIDATE_INT) 返回 false?。 我哭了.....【参考方案2】:

table shown here 更适合您的情况。

它显示TRUE 用于比较0"php"

在比较过程中,您不会将两个操作数都转换为布尔值,但会转换一个操作数以匹配另一个操作数的类型。在您的情况下,字符串被转换为整数,这导致另一个0。这给了你0 == 0,结果为真。

【讨论】:

【参考方案3】:

它们不是同一类型,如果要检查它们是否也属于同一类型,请使用 ===。

【讨论】:

【参考方案4】:

PHP: ==

如果您将数字与字符串进行比较,或者比较涉及 数字字符串,然后将每个字符串转换为数字,然后 以数字方式进行比较。

"string"不是数字格式,所以会转换成0

【讨论】:

【参考方案5】:

在比较过程中,字符串被转换为整数:

var_dump(0);
var_dump((int)"string");
var_dump(0 == "string");

最后一行将自动转换为:

var_dump(0 == (int)"string");

所以这个返回将返回:

int(0)
int(0)
bool(true)
bool(true)

【讨论】:

【参考方案6】:

您首先在此站点上查找比较表:http://php.net/manual/en/language.operators.comparison.php。投射到 bool 不适用于此处。

Operand 1           Operand 2
...
string, resource    string, resource    Translate strings and resources to numbers,
or number           or number           usual math

"string" 转换为 数字 等于 0

【讨论】:

以上是关于为啥整数 0 等于 PHP 中的字符串? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥设置一个变量等于另一个变量会改变这段代码中的任何内容? [复制]

为啥 (13 / 3 == 4) 为真? [复制]

为啥 0.9 等于 0.89999997615814208? [复制]

“long x = 1/2”是等于1还是0,为啥? [复制]

PHP 为啥 0=='all' 为真? [复制]

为啥Lua算术不等于自身? [复制]