==和===的区别是什么?
松==比较究竟是如何工作的? 严格的===比较到底是如何工作的?
有什么有用的例子吗?
==和===的区别是什么?
松==比较究竟是如何工作的? 严格的===比较到底是如何工作的?
有什么有用的例子吗?
当前回答
关于对象比较的其他答案的补充:
==使用对象的名称和它们的值来比较对象。如果两个对象具有相同的类型并且具有相同的成员值,$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
其他回答
关于对象比较的其他答案的补充:
==使用对象的名称和它们的值来比较对象。如果两个对象具有相同的类型并且具有相同的成员值,$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
变量有类型和值。
$var = "test"是一个包含"test"的字符串 $var2 = 24是一个整数,其值为24。
当您使用这些变量(在PHP中)时,有时您没有好的类型。 例如,如果你这样做
if ($var == 1) {... do something ...}
PHP必须将$var转换为整数。在本例中,"$var == 1"为真,因为任何非空字符串都被转换为1。
当使用===时,检查值和类型是否相等,因此"$var === 1"为假。
这很有用,例如,当你有一个函数可以返回false(错误)和0(结果):
if(myFunction() == false) { ... error on myFunction ... }
这段代码是错误的,如果myFunction()返回0,它被强制转换为false,你似乎有一个错误。正确的代码是:
if(myFunction() === false) { ... error on myFunction ... }
因为测试的是返回值“是一个布尔值并且为假”,而不是“可以被强制转换为假”。
在PHP数组和对象中,==和===之间有两个没有人提到的区别:两个具有不同键排序的数组和对象。
两个具有不同键排序的数组
如果你有两个数组,它们的键排序不同,但有相同的键值映射,它们是严格不同的(即使用===)。这可能会导致问题,如果你对一个数组进行键排序,并试图将排序后的数组与原始数组进行比较。
例如:
$arrayUnsorted = [
"you" => "you",
"I" => "we",
];
$arraySorted = $arrayUnsorted;
ksort($arraySorted);
$arrayUnsorted == $arraySorted; // true
$arrayUnsorted === $arraySorted; // false
对象
请记住,主要规则是两个不同的对象永远不会严格相等。请看下面的例子:
$stdClass1 = new stdClass();
$stdClass2 = new stdClass();
$clonedStdClass1 = clone $stdClass1;
$stdClass1 == $stdClass2; // true
$stdClass1 === $stdClass2; // false
$stdClass1 == $clonedStdClass1; // true
$stdClass1 === $clonedStdClass1; // false
注意:将一个对象赋值给另一个变量并不会创建一个副本——相反,它创建了对同一对象的引用。在这里看到的。
注意:从PHP7开始,引入了匿名类。在上面的测试中,新类{}和新stdClass()之间没有区别。
您可以使用===来测试函数或变量是否为假,而不仅仅是等于假(零或空字符串)。
$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;
}
在这种情况下,strpos将返回0,这在测试中等同于false
if ($pos == false)
or
if (!$pos)
这不是你想要的。
这都是关于数据类型的。以BOOL (true或false)为例:
True也等于1和 False也等于0
==在比较时不关心数据类型: 所以如果你有一个变量是1(这也可能是真的):
$ var = 1;
然后与==进行比较:
if ($var == true)
{
echo"var is true";
}
但$var并不等于true,对吧?它的int值为1,而int值为true。
使用===,检查数据类型,以确保两个变量/对象/无论使用相同的类型。
如果我这样做了
if ($var === true)
{
echo "var is true";
}
这个条件不会为真,因为$var !== true它只== true(如果你知道我的意思)。
你为什么需要这个?
简单-让我们来看看PHP的一个函数:array_search():
array_search()函数的作用是:简单地在数组中搜索一个值,并返回该值所在元素的键。如果在数组中找不到该值,则返回false。但是,如果对存储在数组的第一个元素(数组键值为0)....中的值执行array_search()会怎样呢array_search()函数将返回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)
因此,对于这种情况,您可以使用===来代替,以便检查数据类型。