2012-11-13 71 views
3

我被给了一个问题来回答而不执行。对象比较给出致命错误

class Foo { 
    public $x; 
} 
$a = new Foo(); 
$b = new Foo(); 
$a->x = $b; 
$b->x = $a; 

print_r($a == $b); 

我认为这应该打印1,但当我执行它给了一个致命的错误。

Fatal error: Nesting level too deep - recursive dependency? on line 13 

任何人都可以解释为什么我得到这个错误?

+0

你可以使用'==='来比较引用 – strmstn

+0

该错误可以防止编译器必须沿着永无止境的循环兔洞 – Chris

回答

4

由于PHP比较对象的方式。

当您将对象与==进行比较时,PHP会查看每个对象的每个属性(以及嵌套对象,以防某些属性包含其他对象)并比较它们。如果所有的属性都相等,这些对象将被视为相等。

在这种特定情况下,您将对象放置在其他对象的属性中,导致比较引擎循环($a->b->a->b->a->b->...),从而引发错误。

+0

右..很好的解释。谢谢。 –

+0

+很好的解释..... – Baba

1

PHP试图找出对象是否相等,而不是如果引用相等。为了评估这个目标,物体被完全拖曳。该遍历包含指向其他对象的引用。所以你实现了一个无限循环...

+0

谢谢。我现在清楚地看到了错误。 –