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'); }