2014-06-06 45 views
2

我正在構建一個小框架,並試圖在我的一些對象中實現clone()方法。此方法的目標是創建給定記錄的新副本,使用戶更容易在另一個記錄中創建新記錄。PHP中clone()方法的預期回報是多少?

在我看來,使用clone()和__clone()PHP方法是一個完美的場景。但是,究竟應該通過調用clone()返回什麼?當我創建一個克隆時,類似克隆對象的semms與原始的一樣,即使我已經改變了__clone魔術方法中的一些屬性。

下面是我現在做的unitl: 我的應用程序使用了ascincronous通信,所以有一個服務類,由API調用;這個Service類創建了我的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)。相反,我收到相同的原始編號(200)。

這是預期的行爲?

+0

你不應該返回在'__clone'重寫的東西嗎? – jraede

+0

@jraede是的,我試着用'return $ cloned',但行爲是一樣的。 –

回答

3

檢查manual page__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(); 
} 
+0

'save()'可能會生成新的'id'並填充它。有'id'爲'null'直到那時對我來說似乎是合理的。 – Halcyon

+0

除了當然你不需要包含'$ this-> name = $ this-> name'等等,可能會有更好的註釋嗎? –

+0

或者'$ this-> name = clone $ this-> name',如果你想深度拷貝,假設這些值不是標量。 – Halcyon