Paso de objetos por referencia en POO en PHP
Supongamos que tenemos la siguiente clase User:
<?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:
<?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:
<?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:
<?php
$user = new User('john', 30);
?>
Asignemos el objeto a otra variable:
<?php
$test = $user;
?>
Cambiemos la propiedad name
en la variable $test
<?php
$test->name = 'eric';
?>
Comprobemos que el objeto compartido ha cambiado.
Mostremos la propiedad name
desde la variable $user:
<?php
echo $user->name; // ¡mostrará 'eric'!
?>
Crea la clase Product, en la cual
haya las siguientes propiedades: name,
price.
Crea un objeto de la clase Product, guárdalo
en la variable $product1.
Asigna el valor de la variable $product1
a la variable $product2. Verifica
que ambas variables referencian al mismo
objeto.