与克隆实例化PHP中的新对象相比,`clone`有什么优势?

时间:2013-03-29 23:17:13

标签: php object

在此代码中

<?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有什么好处? 除了我们新定义的object1之外,我们是否为object2name的属性获取了所有相同的值?

3 个答案:

答案 0 :(得分:10)

在这种特定情况下,没有区别。如果对象具有其他属性,那么 (如果创建新实例而不是克隆则会重置它们。)

还有其他情况clone可能合适:

  • 如果对象的类没有可供您访问的构造函数
  • 如果对象的类确实有构造函数,但您不知道应该将哪些值传递给它;一般来说,如果你不知道 你将构建一个重复的对象
  • 如果构建新对象具有不合需要的副作用
  • 如果对象具有内部状态,并且您不知道如何从“新构造”状态转移到已有实例的状态

答案 1 :(得分:2)

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

答案 2 :(得分:1)

在这种情况下,没有,因为这是一个极其糟糕的对象借口。

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