'new' 关键字如何与已经包含 'an object identifier' 的 'object variable' 一起使用到一些已经存在的 'object' 或一些 class?

How the 'new' keyword is used with the 'object variable' that already contains 'an object identifier' to some already existing 'object' of some class?

考虑以下来自 PHP Manual 的代码:

<?php
class Test
{
    static public function getNew()
    {
        return new static;
    }
}

class Child extends Test
{}

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

?>

以上代码的输出:

bool(true)

根据我的理解,对象变量 $obj1 包含一个对象标识符,它允许对象访问器找到 class Test.

的实际对象

那么,这个名为$obj1的对象变量在赋值给变量$obj2的时候,是怎么加上关键字new的前缀的呢?

对象变量 $obj1 必须包含 class Test 对象的对象标识符。

这里通过使用 new 关键字和已经包含一些对象标识符的对象变量实现了什么?

var_dump() 语句中实际比较的是什么?

为什么比较的输出为真?

我正在使用 PHP 7.3.0

new $obj1 将创建 $obj1::class(即 Test)的新实例。

var_dump() 语句中的比较是两个对象之间的 strict 比较。它 returns true 因为严格比较正在检查这两个实例($obj1$obj2)是否引用相同 class 的相同实例.

如果比较不严格(例如 $obj1 != $obj2)它将 return false,因为 $obj1 == $obj2(例如两者有相同的属性和值,并且是相同 class)

的实例

在文档 this page 上阅读更多关于对象比较的信息。

您使用的是 7.3 基本上无关紧要。从 5.3 开始你会得到相同的结果