Precisa de um freelancer, códigos-fonte e exemplos completos? Bem-vindo(a) ao meu site. Além de realizar alguns serviços como freelancer eu tenho alguns códigos-fonte e exemplos completos de Java, Delphi, PHP, Python, C/C++, Hibernate, JPA, Spring, JSP, Servlets, Ruby, Ruby On Rails e muitas outras linguagens e frameworks. Veja como falar comigo clicando aqui.
Você
está aqui:Inicio
-> Tutoriais
-> PHP - Aprenda a clonar objetos de uma mesma classe
Aprenda a clonar objetos de uma
mesma classe
Quando fazemos a atribuição
de objetos de uma mesma classe, uma alteração
em um dos objetos afetará os demais. Para evitar isso
podemos usar a palavra-chave clone para efetuar
uma cópia independente do objeto que queremos. Veja:
<?
// definição da classe Pessoa
class Pessoa{
public $nome;
}
// Cria um objeto da classe Pessoa
$cliente = new Pessoa();
$cliente->nome = "Marcos de Souza";
// Clona o primeiro objeto
$cliente2 = clone $cliente;
// Altera a propriedade do segundo objeto
$cliente2->nome = "Fernando Alves";
// As propriedades dos objetos continuam diferentes
echo $cliente->nome . "<br>";
echo $cliente2->nome;
?>
A execução deste código mostra que
os objetos realmente são independentes agora. Existe,
no entando, uma situação em que a clonagem de
objetos deve ser feita com muito cuidado. Se os objetos possuirem
referências a outros objetos, estas referências
serão duplicadas, ou seja, os objetos clonados continuarão
atrelados de alguma forma.
Para resolver o problema, o PHP nos fornece o construtor de
cópia. Veja como usá-lo no exemplo anterior:
// definição da classe Pessoa
class Pessoa{
public
$nome;
function
__clone(){
echo
"Acabei de ser clonado.";
}
}
Assim, se houver referências a outros objetos, o construtor
de cópia é o lugar ideal para criar novas instâncias
das classes referenciadas. Veja um exemplo completo:
class MyFile{
function
setFileName($file_name){
$this->file_name
= $file_name;
}
function
openFileForReading(){
$this->file_handle
= fopen($this->file_name, "r");
}
function
__clone(){
if($this->file_handle){
$this->file_handle
= fopen($this->file_name, "r");
}
}
Todo o conteúdo deste site,
quando não devidamente observado, pertence a seus idealizadores
e não
poderá ser usado para outras finalidades senão estudo e
aprimoramento de técnicas de programação.
Certifique-se de ler asnotas legaisantes de proceder com
o acesso e leitura do
conteúdo disponibilizado nestas páginas.