Passage d'objets par référence en POO en PHP
Supposons que nous ayons la classe User suivante :
<?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 :
<?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 :
<?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 :
<?php
$user = new User('john', 30);
?>
Assignons l'objet à une autre variable :
<?php
$test = $user;
?>
Modifions la propriété name
dans la variable $test
<?php
$test->name = 'eric';
?>
Vérifions que l'objet partagé a changé.
Affichons la propriété name
de la variable $user :
<?php
echo $user->name; // affichera 'eric' !
?>
Créez une classe Product, dans laquelle
se trouveront les propriétés suivantes : name,
price.
Créez un objet de la classe Product, enregistrez-le
dans la variable $product1.
Assignez la valeur de la variable $product1
à la variable $product2. Vérifiez
que les deux variables référencent le même
objet.