Diferença entre cópia de objetos e referência de objetos no PHP

image_pdfimage_print

Um conceito que costuma confundir muitos programadores é o conceito de cópia e referência de objeto no PHP. Diversos horas de programação costumam ser perdidas para descobrir alguns tipos de comportamentos anômalos que costumam ser introduzidos em códigos PHP por programadores que não observam ou desconhecem estas diferenças.

Toda as vezes que um objeto é referenciado a outra através de um operação de igualdade, o que ocorre não é uma clonagem do objeto, ou seja, não é gerado uma cópia do mesmo e repassado para a nova variável, mas apenas uma passagem de referência.

Vamos mostrar um exemplo prática para facilitar o entendimento abaixo. Mas antes, uma pequena explicação dos objetos utilizados.

$objeto_principal será o objeto base para nossa demonstração.
$objeto2_refenciador será o objeto que iremos testar o comportamento e demonstrar ser um mero referenciador
$objeto3_copia será a cópia real e independente do objeto principal

<?php
//Inicializamos cada objeto
$objeto_principal = new stdClass();
$objeto_refenciador = $objeto_principal;
$objeto_copia = clone $objeto_principal;

//Cria um atributo nome no objeto padrão stdClass
$objeto_principal->nome = 'Drall';

// Saida do objeto (stdClass)#1 (1) { ["nome"]=> string(5) "Drall" }
var_dump($objeto_principal);

// Saida do objeto (stdClass)#1 (1) { ["nome"]=> string(5) "Drall" }
var_dump($objeto_referenciador);

// Saida do objeto(stdClass)#2 (0) { }
var_dump($objeto_copia);
Gostou? Tire um minutinho e dê sua contribuição para Drall Dev Community no Patreon!