Předávání objektů odkazem v OOP v PHP
Předpokládejme, že máme danou tuto třídu User:
<?php
class User
{
public $name;
public $age;
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
}
?>
Předpokládejme, že vytváříme objekt této třídy:
<?php
$user = new User('john', 30);
?>
Nyní si představte následující situaci: chcete
hodnotu proměnné $user přiřadit
nějaké jiné proměnné, například
$test.
Pokud by se nejednalo o objekty, ale o primitivní typy,
tj. o řetězce, čísla, pole atd.,
do proměnné $test by se dostala kopie
hodnoty proměnné $user.
To znamená, že změny kterékoliv z proměnných dále by neměnily hodnotu druhé proměnné. Podívejme se na příklad:
<?php
$user = 1;
$test = $user; // v proměnné $test je nyní 1
$test = 2; // v proměnné $test je nyní 2, ale v $user - stále 1
?>
S objekty je to jinak - při zápisu do jiné proměnné se objekty nekopírují, ale předávají odkazem: to znamená, že obě tyto proměnné mají za hodnotu jeden a tentýž objekt. To má důležitý důsledek: pokud změníme nějaké vlastnosti objektu pomocí jedné proměnné, ve druhé proměnné se objeví tytéž změny.
Podívejme se na to v praxi. Vytvořme objekt s uživatelem:
<?php
$user = new User('john', 30);
?>
Přiřaďme objekt do jiné proměnné:
<?php
$test = $user;
?>
Změňme vlastnost name
v proměnné $test
<?php
$test->name = 'eric';
?>
Ověřme, že se změnil společný objekt.
Vypišme vlastnost name
z proměnné $user:
<?php
echo $user->name; // vypíše 'eric'!
?>
Vytvořte třídu Product, ve které
budou následující vlastnosti: name,
price.
Vytvořte objekt třídy Product, zapište
ho do proměnné $product1.
Přiřaďte hodnotu proměnné $product1
do proměnné $product2. Ověřte,
že obě proměnné odkazují na jeden
a tentýž objekt.