-3

我已经阅读了这一点的手册,但我无法理解这背后的逻辑。 http://www.php.net/manual/en/language.oop5.basic.php

$obj1 = new Test();
$obj2 = new $obj1;

var_dump($obj1 === $obj2); //bool(false)

即使发生这种情况,

var_dump($obj1); //object(Test)#1 (0) { } 
var_dump($obj2); //object(Test)#2 (0) { }

我期望 bool(true) 但它是“bool(false)”。

4

2 回答 2

2

根据手册:-

当使用恒等运算符 (===) 时,对象变量是相同的当且仅当它们引用同一类的同一实例

您有同一个类的两个独立===实例,因此计算结果为 false。

所以,$obj1 === $obj2评估为假,但$obj1 == $obj2会评估为真

使用比较运算符(==)时,对象变量的比较方式很简单,即:如果两个对象实例具有相同的属性和值,并且是同一类的实例,则它们相等。

可能是您不知道您已经通过执行创建了一个新的 Test 实例$obj2 = new $obj1;。将其更改为$obj2 = $obj1;,您会发现$obj1 === $obj2评估结果为 true,因为您现在有两个变量引用同一 Test 实例。

于 2013-07-27T07:04:16.947 回答
2

对象只有在引用同一个实例时才是等价的。

$obj1 = new Test();
$obj2 = new Test();
var_dump($obj1 === $obj2); // bool(false)

$obj1 = new Test();
$obj2 = &$obj1;
var_dump($obj1 === $obj2);  // bool(true)
于 2013-07-27T07:05:34.720 回答