2012-08-30 21 views
5

Duplicar posibles:
what is Object Cloning in php?PHP palabra clave clon

estoy estudiando un marco existente que utiliza un "clon" palabra clave mucho, no estoy seguro si esto es una buena idea hacer esta ? realmente no entiendo la necesidad de usar la palabra clave 'clonar'.

por ejemplo, tienen vistazo a esta codificación

es decir

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

me esta función debe ser como la de abajo, no veo la necesidad del clon.

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

El [patrón Prototipo Diseño] (http://www.amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented/dp/0201633612/ref = sr_1_1) también es un buen caso de uso. – pce

Respuesta

6

Motivo de uso de clon es que PHP cuando trabaja con objeto siempre devuelve el objeto como referencia, no como una copia.

Esa es la razón por objeto al pasar a una función que no es necesario especificar con & (referencia):

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

Así que con el fin de obtener el objeto copiar usted tiene que utilizar la palabra clave clon Este es un ejemplo de cómo los objetos se manejan por php y lo hace clon:

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

pesar de que se explica en perfectley another question (gracias por señalar esto @gerald)

sólo una respuesta rápida:

sin un clon de la función devuelve una referencia al objeto startDate. Con clon, devuelve una copia.

si el objeto devuelto se modificará más tarde, solo cambiará la copia y no el original, que también podría usarse en otro lugar.

+0

pero el problema está en el diseño completamente orientado a objetos, necesitamos que el objeto real pase alrededor del objeto clonado, ¿no es así?Para mí, este diseño que usa objetos clonados es incrrecto en una clase cuando la práctica de diseño OO usa ... – mahen3d

3

Quizás startDate es un objeto.

Luego. Cuando devuelve clone $this->startDate, obtiene una copia completa del objeto. Puedes jugar con él, cambiar valores, llamar a funciones. Y, hasta que afecten la base de datos o el sistema de archivos, es seguro y el objeto real startDate no se modificará.

Pero, si solo devuelve el objeto como está, devuelve solo una referencia. Y cualquier operación con objeto que haga, realiza esta operación con el objeto original. Cualquier cambio que realice, afectará al startDate.

Esto es solo para objetos y no afecta a matrices, cadenas y números ya que son variables de tipo valor.

Debe leer más sobre las variables de tipo de valor y las variables de tipo de referencia.