Como los objetos son pasados por referencia, para poder copiar
un objeto, tenemos que clonarlo usando clone.
<?php
class Sheep {
private $name;
function __construct($name) {
$this->setName($name);
}
function setName($name) {
$this->name = $name;
}
function getName() {
return $this->name;
}
}
$wooly = new Sheep('wooly');
$dolly = clone $wooly;
$dolly->setName('dolly');
echo "Esta ovejita es ".$wooly->getName()."<br />\n";
echo "Y esta otra es ".$dolly->getName()."\n";
?>
... ejecutemos este código:
Esta ovejita es wooly<br /> Y esta otra es dolly
Si hay necesidad de mayor control, se tiene que implementar el
método __clone(). Asi que el ejemplo anterior ahora sería:
<?php
class Sheep2 {
public $type;
private $name;
function __construct($name) {
$this->type = "original";
$this->setName($name);
}
function __clone() {
$this->type = "clonada";}
function setName($name) {
$this->name = $name;
}
function getName() {
return $this->name;
}
}
$wooly = new Sheep2('wooly');
$dolly = clone $wooly;
$dolly->setName('dolly');
echo "Esta ovejita es ".$wooly->getName()." y es {$wooly->type}<br />\n";
echo "Y esta otra es ".$dolly->getName()." y es {$dolly->type}\n";
?>
... y ahora obtenemos
Esta ovejita es wooly y es original<br /> Y esta otra es dolly y es clonada