在此代码中
<?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
将复制当前球的实际位置。