這一點已經被提到了(參見 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 物件的等價性:\$leaf1 == \$leaf2 嗎?", ($leaf1 == $leaf2 ? "是" : "否"), "\n";
echo "比較 Leaf 物件的識別性:\$leaf1 === \$leaf2 嗎?", ($leaf1 === $leaf2 ? "是" : "否"), "\n";
echo "\n";
echo "比較 Link 物件的等價性:\$link1 == \$link2 嗎?",($link1 == $link2 ? "是" : "否"), "\n";
echo "比較 Link 物件的識別性:\$link1 === \$link2 嗎?", ($link1 === $link2 ? "是" : "否"), "\n";
?>
儘管 $link1 和 $link2 包含不同的 Leaf 物件,但它們仍然是等價的,因為 Leaf 物件本身是等價的。
實際的結果是,在應該使用「===」的情況下使用「==」可能會導致嚴重的效能損失,尤其是在物件很大或很複雜的情況下。事實上,如果物件之間或(遞迴地)它們的任何屬性之間存在任何循環關係,則由於隱含的無限迴圈,可能會導致致命錯誤。
<?php
類別 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" 來評估 "=="? :) )