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

Retornar