Objektide edastamine viidete kaudu OOP-s PHP-s
Oletame, et meil on antud järgmine klass User:
<?php
class User
{
public $name;
public $age;
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
}
?>
Oletame, et loome selle klassi objekti:
<?php
$user = new User('john', 30);
?>
Kujutage nüüd ette järgmist olukorda: te
soovite muutuja $user väärtuse omistada
mõnele teisele muutujale, näiteks
$test.
Kui tegemist poleks objektidega, vaid primitiividest,
st stringide, arvude, massiivide jms,
siis muutujasse $test saaks muutuja $user väärtuse koopia.
See tähendab, et ühegi muutuja muutmine edaspidi ei muudaks teise muutuja väärtust. Vaatame näidet:
<?php
$user = 1;
$test = $user; // muutujas $test on nüüd 1
$test = 2; // muutujas $test on nüüd 2, kuid $user-s on endiselt 1
?>
Objektidega on teisiti - teise muutuja omistamisel objekte ei kopeerita, vaid edastatakse viite kaudu: see tähendab, et mõlemal muutujal on väärtusena üks ja sama objekt. Sellel on oluline tagajärg: kui muuta mõnda objekti omadust ühe muutuja abil, siis teises muutujas ilmuvad need samad muutused.
Vaatame praktikas. Loome kasutajaga objekti:
<?php
$user = new User('john', 30);
?>
Omistame objekti teise muutuja:
<?php
$test = $user;
?>
Muudame omadust name
muutujas $test
<?php
$test->name = 'eric';
?>
Kontrollime, kas ühine objekt on muutunud.
Väljastame omaduse name
muutujast $user:
<?php
echo $user->name; // väljastab 'eric'!
?>
Tehke klass Product, milles
on järgmised omadused: name,
price.
Looge klassi Product objekt, kirjutage
see muutujasse $product1.
Omistage muutuja $product1 väärtus
muutujasse $product2. Kontrollige
seda, et mõlemad muutujad viitavad ühele
ja samale objektile.