为啥整数 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 中的字符串? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
为啥设置一个变量等于另一个变量会改变这段代码中的任何内容? [复制]
为啥 0.9 等于 0.89999997615814208? [复制]