Overdracht van objecten door referentie in OOP in PHP
Stel dat we de volgende klasse User hebben:
<?php
class User
{
public $name;
public $age;
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
}
?>
Stel dat we een object van deze klasse aanmaken:
<?php
$user = new User('john', 30);
?>
Stel je nu de volgende situatie voor: je
wilt de waarde van variabele $user toewijzen
aan een andere variabele, bijvoorbeeld
$test.
Als het niet om objecten ging, maar om primitieven,
dus om strings, getallen, arrays, enz.,
dan zou in variabele $test een kopie
van de waarde van variabele $user komen.
Dit betekent dat veranderingen in een van de variabelen in de toekomst de waarde van de andere variabele niet zouden wijzigen. Laten we kijken naar een voorbeeld:
<?php
$user = 1;
$test = $user; // in variabele $test zit nu 1
$test = 2; // in variabele $test zit nu 2, en in $user - nog steeds 1
?>
Met objecten is het anders - bij toewijzing aan een andere variabele worden objecten niet gekopieerd, maar overgedragen door referentie: dit betekent dat beide variabelen als waarde hetzelfde object hebben. Dit heeft een belangrijke consequentie: als je eigenschappen van het object wijzigt met behulp van de ene variabele, verschijnen deze wijzigingen ook in de tweede variabele.
Laten we dit in de praktijk bekijken. Laten we een object met een gebruiker aanmaken:
<?php
$user = new User('john', 30);
?>
Laten we het object toewijzen aan een andere variabele:
<?php
$test = $user;
?>
Laten we de eigenschap name wijzigen
in variabele $test
<?php
$test->name = 'eric';
?>
Laten we controleren of het gedeelde object is gewijzigd.
Laten we de eigenschap name uitvoeren
vanuit variabele $user:
<?php
echo $user->name; // geeft 'eric' weer!
?>
Maak een klasse Product, waarin
de volgende eigenschappen zitten: name,
price.
Maak een object van de klasse Product, schrijf
het in variabele $product1.
Wijs de waarde van variabele $product1 toe
aan variabele $product2. Controleer
dat beide variabelen verwijzen naar hetzelfde
object.