2012-08-30 27 views
5

Eventuali duplicati:
what is Object Cloning in php?PHP clone parola chiave

Sto studiando un quadro esistente che utilizza un "clone" parola chiave molto, non so se questa è una buona idea per fare Questo ? Non capisco davvero la necessità di usare la parola chiave 'clone'.

per esempio hanno un'occhiata a questa codifica

cioè

public function getStartDate() 
    { 
    return clone $this->startDate; 
    } 

a me questa funzione dovrebbe essere come qui di seguito, non vedo la necessità del clone.

public function getStartDate() 
    { 
    return $this->startDate; 
    } 
+0

Il [modello Prototype design] (http://www.amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented/dp/0201633612/ref = sr_1_1) è anche un buon caso d'uso. – pce

risposta

6

Motivo per l'utilizzo del clone è che PHP quando si lavora con oggetto restituisce sempre oggetto come riferimento, non come copia.

È per questo che quando si passa oggetto a una funzione non è necessario specificare con & (di riferimento):

function doSomethingWithObject(MyObject $object) { // it is same as MyObject &object 
    ... 
} 

Quindi, al fine di ottenere l'oggetto copiare è necessario utilizzare clone parola chiave Questo è un esempio di come gli oggetti vengono gestiti da PHP e che cosa fa il clone: ​​

class Obj { 
    public $obj; 
    public function __construct() { 
     $this->obj = new stdClass(); 
     $this->obj->prop = 1; // set a public property 
    } 
    function getObj(){ 
     return $this->obj; // it returns a reference 
    } 
} 

$obj = new Obj(); 

$a = $obj->obj; // get as public property (it is reference) 
$b = $obj->getObj(); // get as return of method (it is also a reference) 
$b->prop = 7; 
var_dump($a === $b); // (boolean) true 
var_dump($a->prop, $b->prop, $obj->obj->prop); // int(7), int(7), int(7) 
// changing $b->prop didn't actually change other two object, since both $a and $b are just references to $obj->obj 

$c = clone $a; 
$c->prop = -3; 
var_dump($a === $c); // (boolean) false 
var_dump($a->prop, $c->prop, $obj->obj->prop); // int(7), int(-3), int(7) 
// since $c is completely new copy of object $obj->obj and not a reference to it, changing prop value in $c does not affect $a, $b nor $obj->obj! 
0

nonostante sia perfectley spiegato nel another question (grazie per la precisazione @gerald)

solo un breve risposta:

senza un clone la funzione restituisce un riferimento all'oggetto startDate. Con clone restituisce una copia.

se l'oggetto restituito verrà modificato in seguito, cambia solo la copia e non l'originale, che potrebbe essere utilizzato anche altrove.

+0

ma il problema è nel design completamente orientato agli oggetti, abbiamo bisogno che l'oggetto reale venga passato attorno all'oggetto clone, non è così?per me questo design che usa gli oggetti clone è in una classe quando si usa la pratica di progettazione OO. – mahen3d

3

Forse startDate è un oggetto.

Quindi. Quando si restituisce clone $this->startDate - si ottiene una copia completa dell'oggetto. Puoi giocarci, cambiare valori, chiamare le funzioni. E, finché non influenzano il database o il filesystem, sono sicuri e l'oggetto effettivo startDate non verrà modificato.

Ma, se si restituisce l'oggetto così com'è, si restituisce solo un riferimento. E qualsiasi operazione con l'oggetto che fai - fai questa operazione con l'oggetto originale. Qualsiasi modifica apportata, interesserà lo startDate.

Questo è solo per gli oggetti e non ha effetto su matrici, stringhe e numeri poiché sono variabili di tipo valore.

Si dovrebbe leggere di più su variabili di tipo valore e variabili di tipo di riferimento.