6

在这段代码中

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

4

3 回答 3

13

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

还有其他clone适合的情况:

  • 如果对象的类没有您可以访问的构造函数
  • 如果对象的类确实有构造函数,但你不知道应该传递给它什么值;一般来说,如果你不知道如何构造一个重复的对象
  • 如果构造一个新对象有不受欢迎的副作用
  • 如果对象具有内部状态并且您不知道如何从“新构建”状态移动到您已经拥有的实例的状态
于 2013-03-29T23:21:55.643 回答
2

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

于 2013-03-29T23:20:39.987 回答
1

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

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

于 2013-03-29T23:21:23.240 回答