Método __clone

El método __clone se llama automáticamente cuando se usa el operador clone. Permite definir la lógica propia de copia del objeto. Por defecto, PHP realiza una copia superficial de todas las propiedades del objeto. El método __clone es útil cuando es necesario implementar una copia profunda o cambiar el comportamiento al clonar.

Sintaxis

phppublic function __clone(): void

Ejemplo

Implementemos la clonación básica de un objeto:

php<?php
  class User {
    public $name;
    
    public function __construct($name) {
      $this->name = $name;
    }
    
    public function __clone() {
      echo 'Objeto clonado';
    }
  }
  
  $user1 = new User('John');
  $user2 = clone $user1;
?>

Resultado de ejecutar el código:

php'Objeto clonado'

Ejemplo

Implementemos la copia profunda de un objeto con objetos anidados:

php<?php
  class Address {
    public $city;
    
    public function __construct($city) {
      $this->city = $city;
    }
  }
  
  class User {
    public $name;
    public $address;
    
    public function __construct($name, $city) {
      $this->name = $name;
      $this->address = new Address($city);
    }
    
    public function __clone() {
      $this->address = clone $this->address;
    }
  }
  
  $user1 = new User('John', 'New York');
  $user2 = clone $user1;
  $user2->address->city = 'Boston';
  
  echo $user1->address->city;
?>

Resultado de ejecutar el código:

php'New York'

Ejemplo

Añadamos un identificador único al clonar:

php<?php
  class Product {
    public $id;
    public $name;
    
    public function __construct($name) {
      $this->id = uniqid();
      $this->name = $name;
    }
    
    public function __clone() {
      $this->id = uniqid();
    }
  }
  
  $product1 = new Product('Laptop');
  $product2 = clone $product1;
  
  echo $product1->id . ' ' . $product2->id;
?>

Resultado de ejecutar el código (ejemplo):

php'5f1a2b3c 5f1a2b3d'

Ver también

  • método __construct,
    que es el constructor del objeto