Passagem de objetos por referência em OOP no PHP
Suponha que temos a seguinte classe User:
<?php
class User
{
public $name;
public $age;
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
}
?>
Suponha que criamos um objeto desta classe:
<?php
$user = new User('john', 30);
?>
Agora imagine a seguinte situação: você
deseja atribuir o valor da variável $user
a alguma outra variável, por exemplo,
$test.
Se não estivéssemos falando de objetos, mas de primitivos,
ou seja, strings, números, arrays, etc.,
então a variável $test receberia uma cópia
do valor da variável $user.
Isso significa que alterações em qualquer uma das variáveis posteriormente não alterariam o valor da outra variável. Vejamos um exemplo:
<?php
$user = 1;
$test = $user; // a variável $test agora tem 1
$test = 2; // a variável $test agora tem 2, e $user ainda tem 1
?>
Com objetos é diferente - ao atribuir a outra variável, os objetos não são copiados, mas sim passados por referência: isso significa que ambas as variáveis têm como valor o mesmo objeto. Isso tem uma consequência importante: se alterarmos algumas propriedades do objeto usando uma variável, a segunda variável terá as mesmas alterações.
Vamos ver na prática. Vamos criar um objeto de usuário:
<?php
$user = new User('john', 30);
?>
Vamos atribuir o objeto a outra variável:
<?php
$test = $user;
?>
Vamos alterar a propriedade name
na variável $test
<?php
$test->name = 'eric';
?>
Vamos verificar se o objeto compartilhado foi alterado.
Vamos exibir a propriedade name
da variável $user:
<?php
echo $user->name; // exibirá 'eric'!
?>
Crie uma classe Product, na qual
existirão as seguintes propriedades: name,
price.
Crie um objeto da classe Product, armazene-o
na variável $product1.
Atribua o valor da variável $product1
à variável $product2. Verifique
que ambas as variáveis referem-se ao mesmo
objeto.