这已经提到过(请参阅 jazfresh at hotmail.com 的说明),但这里更详细地说明一下,因为对于对象来说,== 和 === 之间的区别非常重要。
对象上的松散相等 (==) 是递归的:如果正在比较的两个对象的属性本身是对象,那么这些属性也将使用 == 进行比较。
<?php
class Link
{
public $link; function __construct($link) { $this->link = $link; }
}
class Leaf
{
public $leaf; function __construct($leaf) { $this->leaf = $leaf; }
}
$leaf1 = new Leaf(42);
$leaf2 = new Leaf(42);
$link1 = new Link($leaf1);
$link2 = new Link($leaf2);
echo "比较 Leaf 对象等效性:is \$leaf1==\$leaf2? ", ($leaf1 == $leaf2 ? "Yes" : "No"), "\n";
echo "比较 Leaf 对象同一性:is \$leaf1===\$leaf2? ", ($leaf1 === $leaf2 ? "Yes" : "No"), "\n";
echo "\n";
echo "比较 Link 对象等效性:is \$link1==\$link2? ",($link1 == $link2 ? "Yes" : "No"), "\n";
echo "比较 Link 对象同一性:is \$link1===\$link2? ", ($link1 === $link2 ? "Yes" : "No"), "\n";
?>
即使 $link1 和 $link2 包含不同的 Leaf 对象,它们仍然是等效的,因为 Leaf 对象本身是等效的。
实际上,在更适合使用 "===" 时使用 "==" 会导致严重的性能损失,特别是当对象很大或很复杂时。事实上,如果对象之间或其任何属性(递归地)存在循环关系,则由于隐含的无限循环,可能会导致致命错误。
<?php
class Foo { public $foo; }
$t = new Foo; $t->foo = $t;
$g = new Foo; $g->foo = $g;
echo "严格身份: ", ($t===$g ? "True" : "False"),"\n";
echo "松散等效: ", ($t==$g ? "True" : "False"), "\n";
?>
因此,应该优先使用 "===" 而不是 "==" 来比较对象;如果要比较两个不同的对象是否等效,请尝试通过检查合适的单个属性来进行比较。(也许 PHP 可以获得一个魔术方法 "__equals",用于评估 "=="?:) )