19 - función __clone() |
PHP nos permite crear un método que se llamará cuando ejecutemos el operador clone. Este método puede entre otras cosas inicializar algunos atributos.
Si no se define el método __clone se hará una copia idéntica del objeto que le pasamos como parámetro al operador clone.
Veamos un ejemplo: Crearemos una clase Persona que tenga como atributos su nombre y edad, definiremos los métodos para cargar y retornar los valores de sus atributos. Haremos que cuando clonemos un objeto de dicha clase la edad de la persona se fije con cero.
<html>
<head>
<title>Pruebas</title>
</head>
<body>
<?php
class Persona {
private $nombre;
private $edad;
public function fijarNombreEdad($nom,$ed)
{
$this->nombre=$nom;
$this->edad=$ed;
}
public function retornarNombre()
{
return $this->nombre;
}
public function retornarEdad()
{
return $this->edad;
}
public function __clone()
{
$this->edad=0;
}
}
$persona1=new Persona();
$persona1->fijarNombreEdad('Juan',20);
echo 'Datos de $persona1:';
echo $persona1->retornarNombre().' - '.$persona1->retornarEdad().'<br>';
$persona2=clone($persona1);
echo 'Datos de $persona2:';
echo $persona2->retornarNombre().' - '.$persona2->retornarEdad().'<br>';
?>
</body>
</html>
El método __clone se ejecutará cuando llamemos al operador clone para esta clase:
public function __clone()
{
$this->edad=0;
}
Es decir cuando realicemos la asignación:
$persona2=clone($persona1);
inicialmente se hace una copia idéntica de $persona1 pero luego se ejecuta el método __clone con lo que el atributo $edad se modifica.
Si queremos que una clase no pueda clonarse simplemente podemos implementar el siguiente código en el método __clone():
public function __clone()
{
die('No esta permitido clonar objetos de esta clase');
}