Objektumok referenciával történő átadása OOP-ben PHP-ben
Tegyük fel, hogy a következő User osztályunk van:
<?php
class User
{
public $name;
public $age;
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
}
?>
Tegyük fel, hogy létrehozunk egy objektumot ebből az osztályból:
<?php
$user = new User('john', 30);
?>
Képzeljük el a következő helyzetet: a
$user változó értékét szeretnénk
hozzárendelni egy másik változóhoz, például
a $test változóhoz.
Ha nem objektumokról, hanem primitívekről
lenne szó, azaz sztringekről, számokról, tömbökről stb.,
akkor a $test változóba a
$user változó értékének másolata kerülne.
Ez azt jelenti, hogy bármelyik változó módosítása a későbbiekben nem változtatná meg a másik változó értékét. Nézzük meg egy példán:
<?php
$user = 1;
$test = $user; // a $test változóban most 1 van
$test = 2; // a $test változóban most 2 van, a $user-ben viszont továbbra is 1
?>
Az objektumokkal más a helyzet - egy másik változóba való beírásakor az objektumok nem másolódnak, hanem referenciával adódnak át: ez azt jelenti, hogy mindkét változó értéke ugyanaz az objektum. Ennek fontos következménye van: ha megváltoztatjuk az objektum egyes tulajdonságait az egyik változóval, akkor a második változóban is megjelennek ezek a változások.
Nézzük meg a gyakorlatban. Hozzunk létre egy objektumot egy felhasználóval:
<?php
$user = new User('john', 30);
?>
Rendeljük hozzá az objektumot egy másik változóhoz:
<?php
$test = $user;
?>
Változtassuk meg a name tulajdonságot
a $test változóban
<?php
$test->name = 'eric';
?>
Ellenőrizzük, hogy megváltozott-e a közös objektum.
Írjuk ki a name tulajdonságot
a $user változóból:
<?php
echo $user->name; // kiírja 'eric'-et!
?>
Készítsen egy Product osztályt, amelyben
a következő tulajdonságok lesznek: name,
price.
Hozzon létre egy objektumot a Product osztályból, írja
be a $product1 változóba.
Rendelje a $product1 változó értékét
a $product2 változóhoz. Ellenőrizze,
hogy mindkét változó ugyanarra az objektumra hivatkozik.