Passaggio di oggetti per riferimento in OOP in PHP

Supponiamo di avere questa classe User:

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

Supponiamo di creare un oggetto di questa classe:

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

Immaginate ora la seguente situazione: volete assegnare il valore della variabile $user a un'altra variabile, ad esempio $test.

Se non si trattasse di oggetti, ma di primitivi, cioè stringhe, numeri, array, ecc., allora nella variabile $test verrebbe inserita una copia del valore della variabile $user.

Ciò significa che le modifiche a una qualsiasi delle variabili in seguito non cambierebbero il valore dell'altra variabile. Vediamo un esempio:

index.php<?php
  $user = 1;
  
  $test = $user; // nella variabile $test ora c'è 1
  $test = 2;     // nella variabile $test ora c'è 2, mentre in $user - rimane 1
?>

Con gli oggetti è diverso - quando si assegna a un'altra variabile, gli oggetti non vengono copiati, ma passati per riferimento: ciò significa che entrambe queste variabili hanno come valore lo stesso identico oggetto. Questo ha un'importante conseguenza: se si modificano alcune proprietà dell'oggetto con una variabile, nella seconda variabile appariranno queste stesse modifiche.

Vediamo in pratica. Creiamo un oggetto con l'utente:

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

Assegniamo l'oggetto a un'altra variabile:

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

Modifichiamo la proprietà name nella variabile $test

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

Verifichiamo che l'oggetto condiviso sia cambiato. Stampiamo la proprietà name dalla variabile $user:

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

Create una classe Product, in cui ci siano le seguenti proprietà: name, price.

Задание 2

Create un oggetto della classe Product, assegnatelo alla variabile $product1.

Задание 3

Assegnate il valore della variabile $product1 alla variabile $product2. Verificate che entrambe le variabili si riferiscano allo stesso identico oggetto.