我试过这段代码:
$ac1 = new class {};
$ac2 = new class {};
var_dump($ac1); // object(class@anonymous)#1 (0) {}
var_dump($ac2); // object(class@anonymous)#2 (0) {}
var_dump(new class {}); // object(class@anonymous)#3 (0) {}
var_dump($ac1 == $ac2); // bool(false)
var_dump($ac1 == new class {}); // bool(false)
var_dump($ac2 == new class {}); // bool(false)
上述比较结果均为 false 。
但是,当我声明一个返回匿名类的函数时,结果如下:
function anonymous_class() {
return new class {};
}
$ac1 = anonymous_class();
$ac2 = anonymous_class();
var_dump($ac1); // object(class@anonymous)#1 (0) {}
var_dump($ac2); // object(class@anonymous)#2 (0) {}
var_dump(anonymous_class()); // object(class@anonymous)#3 (0) {}
var_dump($ac1 == $ac2); // bool(true)
var_dump($ac1 == anonymous_class()); // bool(true)
var_dump($ac2 == anonymous_class()); // bool(true)
全部打印 true 。
现在,问题是,这是怎么发生的?特别是,为什么它会为第二个上下文打印 true ,知道每个var_dump()
实例的结果不同?
答案 0 :(得分:6)
来自doc http://php.net/manual/en/language.oop5.anonymous.php
由同一个匿名类声明创建的所有对象都是该类的实例。
<?php
function anonymous_class()
{
return new class {};
}
if (get_class(anonymous_class()) === get_class(anonymous_class())) {
echo 'same class';
} else {
echo 'different class';
}
以上示例将输出:相同的类
来自http://php.net/manual/en/language.oop5.object-comparison.php
当使用比较运算符
==
时,对象变量以简单的方式进行比较,即:如果两个对象实例具有相同的属性和值(值与==进行比较),则它们是相等的,并且是实例同一个班级。