与在PHP中实例化一个新对象相比,“克隆”的优势是什么?


What's the advantage of `clone` over instantiating a new object in PHP?

在此代码中

<?php
$object1        = new User();
$object1->name = "Alice";
$object2        = clone $object1;
$object2->name = "Amy";
echo "object1 name = " . $object1->name . "<br>";
echo "object2 name = " . $object2->name;
class User
{
    public $name;
}
?>

使用clone而不仅仅是new的优势是什么?除了我们新定义的name,我们在object2中获得object1属性的所有相同值是这样吗?

在这种具体情况下没有区别。如果对象有其他属性,将是不同的(如果创建新实例而不是克隆,它们将被重置)。

也有其他适合clone的情况:

  • 如果对象的类没有可访问的构造函数
  • 如果对象的类确实有构造函数,但你不知道应该传递什么值给它;一般来说,如果你不知道如何,你会构造一个重复的对象
  • 如果构造一个新对象有不希望的副作用
  • 如果对象有内部状态,而你不知道如何从"新构建的"状态移动到你已经拥有的实例的状态

clone将复制所有属性值,而不是将它们重置为默认值。例如,如果您有一个查询构建器类,并且希望两个查询几乎相同,但有一两个小的差异,则非常有用。将查询构建到起始点,克隆它,然后以一种方式使用,另一种方式使用。

在本例中,没有,因为这是一个非常糟糕的对象借口。

但是,假设你正在创建一个游戏,其中每个类代表游戏中的一种对象类型。一个这样的物体可能是一个球,它会弹来弹去。在这种情况下,new Ball()将在起始位置创建一个新球,并且它将跟随第一个球反弹。但是,clone $ball1将复制当前球的实际位置。