Metodo __clone

Il metodo __clone viene chiamato automaticamente quando si utilizza l'operatore clone. Permette di definire una logica personalizzata per la copia dell'oggetto. Per impostazione predefinita, PHP esegue una copia superficiale di tutte le proprietà dell'oggetto. Il metodo __clone è utile quando è necessario implementare una copia profonda o modificare il comportamento durante la clonazione.

Sintassi

phppublic function __clone(): void

Esempio

Implementiamo la clonazione base di un oggetto:

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

Risultato dell'esecuzione del codice:

php'Oggetto clonato'

Esempio

Implementiamo una copia profonda di un oggetto con oggetti annidati:

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;
?>

Risultato dell'esecuzione del codice:

php'New York'

Esempio

Aggiungiamo un identificatore unico durante la clonazione:

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;
?>

Risultato dell'esecuzione del codice (esempio):

php'5f1a2b3c 5f1a2b3d'

Vedi anche

  • metodo __construct,
    che è il costruttore dell'oggetto