__clone: Criando clones de objetos em PHP

Criar clones de objetos em PHP é extremamente simples, você pode utilizar a palavra {php}clone{/php} para criar um objeto exatamente idêntico ao objeto clonado.

Veja um exemplo:

<?php 
class Pessoa
{
	// Propriedades da classe
	public $nome;
	public $sobrenome;
	public $idade;
	
	// Construtor - Define os valores das propriedades
	public function __construct ( $nome = null, $sobrenome = null, $idade = 0 ) {
		$this->nome      = $nome;
		$this->sobrenome = $sobrenome;
		$this->idade     = (int) $idade;
	}
	
	// Método para exibir
	public function exibir () {
		echo 'Nome: ';
		echo $this->nome . '<br>';
		echo 'Sobrenome: ';
		echo $this->sobrenome . '<br>';
		echo 'Idade: ';
		echo $this->idade . '<br><br>';
	}
}

// Instância da classe Pessoa
$pessoa = new Pessoa('Luiz', 'Miranda Figueiredo', 27);

// Aqui está o clone
$pessoa2 = clone $pessoa;
$pessoa2->exibir();
?>

No trecho acima, o objeto {php}$pessoa2{/php} recebe exatamente tudo o que o objeto {php}$pessoa{/php} possui. Como resultado teremos:

Nome: Luiz
Sobrenome: Miranda Figueiredo
Idade: 27

Porém, é meio inútil que você clone um objeto para outro, já que você pode utilizar o objeto criado anteriormente. Por isso, existe um método mágico, que não descrevemos na aula 37 (Métodos mágicos em classes PHP), que faz toda a diferença para os clones em PHP: O método {php}__clone{/php}.

Este método é utilizado no objeto original, que quando clonado, executa as ações de {php}__clone{/php} para realizar as alterações necessárias no novo objeto.

Veja um exemplo de alteração através do método {php}__clone{/php}.

<?php 
class Pessoa
{
	// Propriedades da classe
	public $nome;
	public $sobrenome;
	public $idade;
	
	// Construtor - Define os valores das proprieades
	public function __construct ( $nome = null, $sobrenome = null, $idade = 0 ) {
		$this->nome      = $nome;
		$this->sobrenome = $sobrenome;
		$this->idade     = (int) $idade;
	}
	
	// Método para exibir
	public function exibir () {
		echo 'Nome: ';
		echo $this->nome . '<br>';
		echo 'Sobrenome: ';
		echo $this->sobrenome . '<br>';
		echo 'Idade: ';
		echo $this->idade . '<br><br>';
	}
	
	// Método executado ao criar um clone
	public function __clone () {
		// Se for um clone, adiciona a palavra "Clonado" no valor
		$this->nome      = $this->nome . ' (Clonado)';
		$this->sobrenome = $this->sobrenome . ' (Clonado)';
		$this->idade     = $this->idade . ' (Clonado)';
	}
}

// Instância da classe Pessoa
$pessoa = new Pessoa('Luiz', 'Miranda Figueiredo', 27);

// Aqui está o clone
$pessoa2 = clone $pessoa;
$pessoa2->exibir();
?>

Perceba que estou alterando o valor das variáveis da classe no método {php}__clone{/php}, ou seja, agora tenho um novo resultado vindo do clone.

Nome: Luiz (Clonado)
Sobrenome: Miranda Figueiredo (Clonado)
Idade: 27 (Clonado)

Concluindo

A utilização de clones de objetos em PHP é bastante útil quando utilizamos o método {php}__clone{/php}. Dependendo da sua imaginação, você pode facilitar bastante a sua vida.

Não deixe de seguir todas as aulas do nosso curso gratuito de PHP e de PHP Orientado a Objetos.

Caso tenha dúvidas, não hesite em comentar.