Methode __clone

De methode __clone wordt automatisch aangeroepen bij gebruik van de clone operator. Hiermee kan men eigen kopieerlogica voor een object definiëren. Standaard voert PHP een ondiepe kopie (shallow copy) uit van alle eigenschappen van het object. De methode __clone is nuttig wanneer men een diepe kopie (deep copy) moet implementeren of het gedrag bij het klonen wil aanpassen.

Syntaxis

phppublic function __clone(): void

Voorbeeld

Laten we basiskloning van een object implementeren:

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

Resultaat van de code-uitvoering:

php'Object gekloond'

Voorbeeld

Laten we diepe kopiëring van een object met geneste objecten implementeren:

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

Resultaat van de code-uitvoering:

php'New York'

Voorbeeld

Laten we een unieke identifier toevoegen bij het klonen:

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

Resultaat van de code-uitvoering (voorbeeld):

php'5f1a2b3c 5f1a2b3d'

Zie ook

  • de methode __construct,
    die de constructor van het object is