PHP中clone()方法的预期返回是什么?

PHP中clone()方法的预期返回是什么?,php,Php,我正在构建一个小框架,并试图在我的一些对象中实现clone()方法。此方法的目标是创建给定记录的新副本,使用户可以更轻松地基于另一个记录创建新记录 在我看来,使用clone()和_clone()PHP方法是一个完美的场景。但是调用clone()应该返回什么呢?创建克隆时,克隆对象之类的semm与原始对象相同,尽管我在_clone magic方法中更改了一些属性 以下是我现在所做的工作: 我的应用程序使用了一个不规则的通信,因此有一个由API调用的服务类;此服务类创建my Record类的新实例,

我正在构建一个小框架,并试图在我的一些对象中实现clone()方法。此方法的目标是创建给定记录的新副本,使用户可以更轻松地基于另一个记录创建新记录

在我看来,使用clone()和_clone()PHP方法是一个完美的场景。但是调用clone()应该返回什么呢?创建克隆时,克隆对象之类的semm与原始对象相同,尽管我在_clone magic方法中更改了一些属性

以下是我现在所做的工作: 我的应用程序使用了一个不规则的通信,因此有一个由API调用的服务类;此服务类创建my Record类的新实例,并创建克隆。在这个Record类中,有一个_clone magic方法的实现,用于对数据进行一些更改,并保存新记录

服务类中的cloneRecord方法:

public function cloneRecord($original_id) {
    $originalObject = new Record($original_id);
    $originalObject->load(); //access the database and retrieve the property values for this record
    $cloned = clone $originalObject;
    return $cloned->id; // here is the problem! See explanation below
}
记录类中的_clone方法:

public function __clone() {
    $cloned = new Record();

    //id and code will be generated automatically in the save() method:
    $cloned->id = NULL;
    $cloned->code = NULL;

    //these other properties will be cloned:
    $cloned->name = $this->name;
    $cloned->startDate = $this->startDate;
    $cloned->dueDate = $this->dueDate;

    $cloned->save();
}
在这之前,一切似乎都正常工作。新记录保存到数据库中,并为此新记录生成新id和新代码

如何调用该方法:

$service = new Service();
$newRecordId = $service->cloneRecord(200);
这里发生了奇怪的事情! 我希望从上面这行中得到的是新记录的id(可能是201)。相反,我收到了相同的原始id(200)

这是预期的行为吗?

检查
\uu clone()
的属性。它说:

克隆完成后,如果定义了_clone()方法,则将调用新创建的对象的_clone()方法,以允许更改任何必要的属性

这意味着
\uu clone()
将在新创建的对象的范围内运行


您的
\uu clone()
方法应如下所示:

public function __clone() {

    //id and code will be generated automatically in the save() method:
    $this->id = NULL;
    $this->code = NULL;

    // I would not put it here. It should happen explicitly (imo)
    // But this design decision is up to you.
    $this->save(); 
}

你不应该在你的
\uu clone
覆盖中返回一些东西吗?@jrade是的,我尝试了
返回$clone
,但行为是一样的。
保存()
可能会生成新的
id
,并填充它。在此之前,将
id
设置为
null
对我来说似乎是合理的。当然,除了您不需要包含
$this->name=$this->name
等内容外,可能最好将其注释掉?或者如果您想要深度复制,
$this->name=clone$this->name
,假设值不是标量。@RafaelHenrique
可能$this在uu clone()引用中指向克隆对象
。是的,文件说明了这一点。是的,最好在服务类中调用save。这是因为通常使用
clone$obj不会导致此类副作用。因此,您可能正在使用(或将来可能会使用)其他库,这些库可能会调用clone—无论出于何种原因—因为它们不会产生这些副作用。@hek2mgl使用您的_clone()实现工作得非常出色!谢谢