Passaggio di oggetti per riferimento in OOP in PHP
Supponiamo di avere questa classe User:
<?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:
<?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:
<?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:
<?php
$user = new User('john', 30);
?>
Assegniamo l'oggetto a un'altra variabile:
<?php
$test = $user;
?>
Modifichiamo la proprietà name
nella variabile $test
<?php
$test->name = 'eric';
?>
Verifichiamo che l'oggetto condiviso sia cambiato.
Stampiamo la proprietà name
dalla variabile $user:
<?php
echo $user->name; // stamperà 'eric'!
?>
Create una classe Product, in cui
ci siano le seguenti proprietà: name,
price.
Create un oggetto della classe Product, assegnatelo
alla variabile $product1.
Assegnate il valore della variabile $product1
alla variabile $product2. Verificate
che entrambe le variabili si riferiscano allo stesso
identico oggetto.