Paso de objetos por referencia en POO en PHP

Supongamos que tenemos la siguiente clase User:

User.php<?php
  class User
  {
    public $name;
    public $age;
    
    public function __construct($name, $age)
    {
      $this->name = $name;
      $this->age  = $age;
    }
  }
?>

Supongamos que creamos un objeto de esta clase:

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

Imagina ahora la siguiente situación: quieres asignar el valor de la variable $user a alguna otra variable, por ejemplo $test.

Si no estuviéramos hablando de objetos, sino de primitivos, es decir, de cadenas, números, arrays, etc., entonces la variable $test obtendría una copia del valor de la variable $user.

Esto significa que los cambios en cualquiera de las variables en el futuro no cambiarían el valor de la otra variable. Veamos un ejemplo:

index.php<?php
  $user = 1;
  
  $test = $user; // en la variable $test ahora hay 1
  $test = 2;     // en la variable $test ahora hay 2, y en $user - todavía 1
?>

Con los objetos es diferente - al asignarlos a otra variable, los objetos no se copian, sino que se pasan por referencia: esto significa que ambas variables tienen como valor un mismo objeto. Esto tiene una consecuencia importante: si se cambian algunas propiedades del objeto usando una variable, en la segunda variable aparecerán estos mismos cambios.

Veámoslo en la práctica. Creemos un objeto con un usuario:

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

Asignemos el objeto a otra variable:

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

Cambiemos la propiedad name en la variable $test

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

Comprobemos que el objeto compartido ha cambiado. Mostremos la propiedad name desde la variable $user:

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

Crea la clase Product, en la cual haya las siguientes propiedades: name, price.

Задание 2

Crea un objeto de la clase Product, guárdalo en la variable $product1.

Задание 3

Asigna el valor de la variable $product1 a la variable $product2. Verifica que ambas variables referencian al mismo objeto.