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



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

在我看来,使用clone()和__clone() PHP方法是一个完美的场景。但是调用clone()应该返回什么呢?当我创建一个克隆对象时,即使我改变了__clone魔术方法中的一些属性,看起来克隆对象与原始对象相同。

以下是我到目前为止所做的:我的应用程序使用异步通信,所以有一个Service类,由API调用;这个Service类创建Record类的一个新实例,并创建一个克隆。在这个Record类中,有一个__clone魔术方法的实现,可以对数据进行一些更改,并保存新记录。

服务类中的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)。

这是预期的行为吗?

查看__clone()的手册页。它说:

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

这意味着__clone()将在新创建的对象的作用域中运行。


你的__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(); 
}

最新更新