【问题标题】:PHP 7 - Comparing Anonymous Class InstancesPHP 7 - 比较匿名类实例
【发布时间】:2016-10-06 08:59:20
【问题描述】:

我试过这段代码:

$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() 实例的结果都不同?

【问题讨论】:

  • 作为一个快速而松散的答案:在您的第一个示例中,您有三个不同的“物理”class 声明,它们成为三个不同的类。在第二个示例中,您只有一个 class,以及它的三个实例。
  • @deceze 你总结得很好。为什么不让它成为一个答案?
  • @chumkiu 已经做得很好了。

标签: php php-7 anonymous-class


【解决方案1】:

来自文档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';
}

上面的例子会输出:same class

来自http://php.net/manual/en/language.oop5.object-comparison.php

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

【讨论】:

  • 是的,我已经读过,但是检查每个实例的var_dump() 输出,它们是不同的。
  • @Rax 类名后面的#1实例计数器class@anonymous 的第一个实例)。类名在所有情况下都是相同的。
  • 结合你的答案和@deceze's让我清楚地看到它。太棒了。
猜你喜欢
  • 2016-10-12
  • 2018-05-22
  • 2015-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多