Passagem de objetos por referência em OOP no PHP

Suponha que temos a seguinte classe User:

User.php<?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:

index.php<?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:

index.php<?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:

index.php<?php
  $user = new User('john', 30);
?>

Vamos atribuir o objeto a outra variável:

index.php<?php
  $test = $user;
?>

Vamos alterar a propriedade name na variável $test

index.php<?php
  $test->name = 'eric';
?>

Vamos verificar se o objeto compartilhado foi alterado. Vamos exibir a propriedade name da variável $user:

index.php<?php
  echo $user->name; // exibirá 'eric'!
?>
Задание 1

Crie uma classe Product, na qual existirão as seguintes propriedades: name, price.

Задание 2

Crie um objeto da classe Product, armazene-o na variável $product1.

Задание 3

Atribua o valor da variável $product1 à variável $product2. Verifique que ambas as variáveis referem-se ao mesmo objeto.