Passage d'objets par référence en POO en PHP

Supposons que nous ayons la classe User suivante :

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

Supposons que nous créions un objet de cette classe :

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

Imaginez maintenant la situation suivante : vous voulez assigner la valeur de la variable $user à une autre variable, par exemple $test.

S'il ne s'agissait pas d'objets, mais de primitives, c'est-à-dire de chaînes de caractères, de nombres, de tableaux, etc., alors la variable $test recevrait une copie de la valeur de la variable $user.

Cela signifie que les modifications apportées à l'une des variables ultérieurement ne changeraient pas la valeur de l'autre variable. Regardons un exemple :

index.php<?php
  $user = 1;
  
  $test = $user; // la variable $test contient maintenant 1
  $test = 2;     // la variable $test contient maintenant 2, et $user - toujours 1
?>

Avec les objets, c'est différent - lors de l'assignation à une autre variable, les objets ne sont pas copiés, mais sont passés par référence : cela signifie que ces deux variables ont pour valeur le même objet. Cela a une conséquence importante : si vous modifiez certaines propriétés de l'objet avec l'une des variables, la seconde variable reflétera ces mêmes changements.

Voyons cela en pratique. Créons un objet utilisateur :

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

Assignons l'objet à une autre variable :

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

Modifions la propriété name dans la variable $test

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

Vérifions que l'objet partagé a changé. Affichons la propriété name de la variable $user :

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

Créez une classe Product, dans laquelle se trouveront les propriétés suivantes : name, price.

Задание 2

Créez un objet de la classe Product, enregistrez-le dans la variable $product1.

Задание 3

Assignez la valeur de la variable $product1 à la variable $product2. Vérifiez que les deux variables référencent le même objet.