==
和===
之间有什么区别?- 宽松比较
==
是如何工作的? - 严格比较
===
是如何工作的?
有哪些有用的例子?
==
和===
之间有什么区别?==
是如何工作的?===
是如何工作的?有哪些有用的例子?
==
和===
的区别宽松等于操作符==
和严格全等操作符===
的区别在官方文档中有详细解释:
比较运算符
示例 | 名称 | 结果 |
---|---|---|
$a == $b | 相等 | 如果执行类型强制转换后 $a 等于 $b,则返回TRUE。 |
$a === $b | 全等 | 如果 $a 等于 $b 并且它们的类型相同,则返回 TRUE。 |
==
等于比较如果你使用==
操作符或其他使用宽松比较的操作符,例如!=
,<>
或==
,则需要始终查看上下文来确定何时会进行类型转换以及转换规则,才能理解运算的实际含义。
作为参考和示例,你可以在官方文档中查看类型比较表格:
TRUE | FALSE | 1 | 0 | -1 | "1" | "0" | "-1" | NULL | array() | "php" | "" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
TRUE | TRUE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
FALSE | FALSE | TRUE | FALSE | TRUE | FALSE | FALSE | TRUE | FALSE | TRUE | TRUE | FALSE | TRUE | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1 | FALSE | FALSE | TRUE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
0 | FALSE | FALSE | FALSE | TRUE | FALSE | FALSE | TRUE | FALSE | TRUE | TRUE | FALSE | TRUE | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-1 | FALSE | FALSE | FALSE | FALSE | TRUE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"1" | FALSE | FALSE | FALSE | FALSE | FALSE | TRUE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"0" | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | TRUE | FALSE | FALSE | FALSE | FALSE | FALSE | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"-1" | FALSE | FALSE | FALSE | FALSE | TRUE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
NULL | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | TRUE | TRUE | FALSE | FALSE | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
array() | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | TRUE | TRUE | FALSE | FALSE | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"php" | FALSE | FALSE | FALSE | TRUE | FALSE | FALSE如果您使用 === 操作符或任何其他使用严格比较的比较操作符,如 !== 或 === ,则始终可以确保类型不会 神奇地 更改,因为没有进行转换。因此,在使用严格比较时,类型和值必须相同,而不仅是值。
类型比较表作为参考和示例,您可以在手册中查看比较表:
|
false
,但只要它们的值相等,在PHP中会返回true
。 - Pacerier"000" != "00"
, "000" == null
, "000" == false
, "0x0" == false
, array() == 0
, false != null
, array() != null
, false == "0x0"
, false == "000"
. 而在PHP中,情况则相反: "000" == "00"
, "000" != null
, "000" != false
, "0x0" != false
, array() != 0
, false == null
, array() == null
, false != "0x0"
, false != "000"
。 - Pacerier如果两个不同的类型进行比较,操作符“==”会进行强制类型转换,而操作符“===”则执行“类型安全比较”。这意味着只有当两个操作数具有相同的类型和相同的值时,它才会返回true。
示例:
1 === 1: true
1 == 1: true
1 === "1": false // 1 is an integer, "1" is a string
1 == "1": true // "1" gets casted to an integer, which is 1
"foo" === "foo": true // both operands are strings and have the same value
警告:具有相同成员的两个实例属于同一个类,但却无法匹配===
运算符。例如:
$a = new stdClass();
$a->foo = "bar";
$b = clone $a;
var_dump($a === $b); // bool(false)
一图胜千言:
==
等值运算符表格:===
全等运算符表格:创建这些图像的源代码:
https://github.com/sentientmachine/php_equality_charts
那些希望保持清醒的人,不要再往下读了,因为这一切都没有任何意义,除了说这就是 PHP 疯狂的分形设计。
NAN != NAN
但是 NAN == true
。
==
如果左边是数字,它会将左右操作数转换为数字,所以 123 == "123foo"
,但是 "123" != "123foo"
用引号括起来的十六进制字符串有时会被意外强制转换为浮点数,导致运行时错误。
==
不是传递性的,因为 "0" == 0
,0 == ""
但是 "0" != ""
PHP 中尚未声明的变量为false
,即使 PHP 有一种表示未定义的变量的方法,该特性在使用 ==
时被禁用。
"6" == " 6"
、"4.2" == "4.20"
和"133" == "0133"
,但是133 != 0133
。但是"0x10" == "16"
和"1e3" == "1000"
表明意外的八进制字符串转换会在没有指示或同意的情况下发生,从而导致运行时错误。
False == 0
,""
,[]
和"0"
。
如果你给一个数字加1后它们已经达到了最大值,它们不会绕回,而是被强制转换为infinity
。
一个新的类等于1。
False是最危险的值,因为False等于大多数其他变量,这大多数情况下会使其失去作用。
如果您使用PHP,请不要使用双等号运算符,因为如果您使用三个等号,唯一需要担心的是NAN和接近其数据类型的最大值的数字,因为它们将被强制转换为无穷。使用双等号时,任何东西都可以意外地==
为任何其他内容,或者会在未经同意的情况下令人惊讶地进行强制转换,并!=
到一个明显应该相等的内容。
在PHP中任何使用==
的地方都是糟糕的代码味道,因为根据隐式转换规则,它暴露了85个错误,这些规则似乎是由数百万程序员通过布朗运动编程设计的。
1.0 !== 1
,这可能会让人有些困惑,例如 floor(4 / 3) === 1 ? 'works as might be expected' : 'what?'
。 - Jakefloor(4/3) === 1
不会被评估为真,因为 floor
返回一个 float
(即使返回值必须是整数,但它不是按类型定义的)- 因此需要指出这个陷阱的原因。JavaScript 没有这个问题,因为它只有一种数字类型(尽管由于这个原因存在其他问题,如整数舍入)。 - Jakevar x = 4;
var y = '4';
if (x == y) {
alert('x and y are equal');
}
if (x === y) {
alert('x and y are identical');
}
关于对象比较的其他答案中还有一个补充:
== 使用对象名称和它们的值来比较对象。如果两个对象是相同类型并且具有相同的成员值,则$a == $b
将返回true。
=== 比较对象的内部对象ID。即使成员相等,如果它们不是完全相同的对象,则$a !== $b
。
class TestClassA {
public $a;
}
class TestClassB {
public $a;
}
$a1 = new TestClassA();
$a2 = new TestClassA();
$b = new TestClassB();
$a1->a = 10;
$a2->a = 10;
$b->a = 10;
$a1 == $a1;
$a1 == $a2; // Same members
$a1 != $b; // Different classes
$a1 === $a1;
$a1 !== $a2; // Not the same object
BOOL
(真或假)为例:
true
也等于1
,false
也等于0
当使用==
进行比较时,不考虑数据类型:true
),那么:
$var=1;
然后使用==
进行比较:if ($var == true)
{
echo"var is true";
}
但是$var
实际上并不等于true
,是吗?它的整数值为1
,而这个值代表了true
。
使用===
时,会检查数据类型以确保两个变量/对象/任何内容使用相同的类型。
所以如果我执行以下操作:
if ($var === true)
{
echo "var is true";
}
如果条件为$var !== true
,那么它只有在== true
的情况下才会成立(如果你知道我的意思的话)。
为什么需要这个呢?
很简单——让我们来看一下PHP的一个函数:array_search()
:
array_search()
函数只是在数组中搜索一个值,并返回值所在元素的键。如果在数组中找不到该值,则返回false。但是,如果你在数组的第一个元素中进行array_search()
,它将返回0,而0等于false。
所以,如果你这样做:
$arr = array("name");
if (array_search("name", $arr) == false)
{
// This would return 0 (the key of the element the val was found
// in), but because we're using ==, we'll think the function
// actually returned false...when it didn't.
}
所以,现在你知道这可能是一个问题了吗?
大多数人在检查函数是否返回false时不使用== false
。相反,他们使用!
。但事实上,这与使用== false
完全相同,因此如果你这样做:
$arr = array("name");
if (!array_search("name", $arr)) // This is the same as doing (array_search("name", $arr) == false)
对于这种情况,你应该使用===
,以便检查数据类型。
==
:在大多数编程语言中,比较运算符(==)会检查变量的数据类型和内容是否相等。但是,在PHP中,标准的比较运算符(==)有所不同。它会尝试将两个变量转换为相同的数据类型,然后再检查这些变量的内容是否相同。得到以下结果:
<?php
var_dump( 1 == 1 ); // true
var_dump( 1 == '1' ); // true
var_dump( 1 == 2 ); // false
var_dump( 1 == '2' ); // false
var_dump( 1 == true ); // true
var_dump( 1 == false ); // false
?>
===
:这个运算符还会检查变量的数据类型,仅在两个变量具有相同内容和相同数据类型时返回(bool)true。因此,以下操作将是正确的:
<?php
var_dump( 1 === 1 ); // true
var_dump( 1 === '1' ); // false
var_dump( 1 === 2 ); // false
var_dump( 1 === '2' ); // false
var_dump( 1 === true ); // false
var_dump( 1 === false ); // false
?>
$needle = 'a';
$haystack = 'abc';
$pos = strpos($haystack, $needle);
if ($pos === false) {
echo $needle . ' was not found in ' . $haystack;
} else {
echo $needle . ' was found in ' . $haystack . ' at location ' . $pos;
}
if ($pos == false)
或者
if (!$pos)
$n = 1000;
$d = $n + 0.0e0;
echo '<br/>'. ( ($n == $d)?'equal' :'not equal' );
echo '<br/>'. ( ($n === $d)?'equal' :'not equal' );
equal
not equal
“==”(等于)与“===”(全等于)的区别
PHP提供了两个比较运算符来检查两个值是否相等。它们之间的主要区别在于,'=='
检查两个操作数的值是相等或不相等
. 另一方面,'==='
检查操作数的值和类型是相等或不相等
。
== (等于)
=== (全等于)
示例 =>
<?php
$val1 = 1234;
$val2 = "1234";
var_dump($val1 == $val2);// output => bool(true)
//It checks only operands value
?>
<?php
$val1 = 1234;
$val2 = "1234";
var_dump($val1 === $val2);// output => bool(false)
//First it checks type then operands value
?>
<?php
$val1 = 1234;
$val2 = "1234";
var_dump($val1 === (int)$val2);// output => bool(true)
//First it checks type then operands value
?>
或者
<?php
$val1 = 1234;
$val2 = "1234";
var_dump($val1 === (int)$val2);// output => bool(true)
//First it checks type then operands value
?>