Kalimi i objekteve me referencë në OOP në PHP
Le të kemi klasën User si më poshtë:
<?php
class User
{
public $name;
public $age;
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
}
?>
Le të krijojmë një objekt të kësaj klase:
<?php
$user = new User('john', 30);
?>
Imagjinoni tani situatën e mëposhtme: ju
dëshironi të caktoni vlerën e ndryshores $user
ndonjë ndryshoreje tjetër, për shembull
$test.
Nëse nuk do të ishte fjala për objekte, por për primitiva,
d.m.th për vargje, numra, vargje etj,
atëherë në ndryshoren $test do të shkonte një kopje
e vlerës së ndryshores $user.
Kjo do të thotë se ndryshimet në cilindo nga ndryshoret në të ardhmen nuk do të ndryshonin vlerën e ndryshores tjetër. Le të shohim një shembull:
<?php
$user = 1;
$test = $user; // në ndryshoren $test tani është 1
$test = 2; // në ndryshoren $test tani është 2, kurse në $user - ende 1
?>
Me objektet është ndryshe - kur shkruhen në ndonjë ndryshore tjetër, objektet nuk kopjohen, por kalohen me referencë: kjo do të thotë se të dyja këto ndryshore kanë si vlerë të njëjtin objekt. Kjo ka një pasojë të rëndësishme: nëse ndryshohen disa veti të objektit duke përdorur një ndryshore, në ndryshoren e dytë do të shfaqen të njëjtat ndryshime.
Le të shohim në praktikë. Le të krijojmë një objekt me përdorues:
<?php
$user = new User('john', 30);
?>
Le ta caktojmë objektin në një ndryshore tjetër:
<?php
$test = $user;
?>
Le të ndryshojmë vetinë name
në ndryshoren $test
<?php
$test->name = 'eric';
?>
Le të kontrollojmë nëse ka ndryshuar objekti i përbashkët.
Le të shfaqim vetinë name
nga ndryshorja $user:
<?php
echo $user->name; // do të shfaqë 'eric'!
?>
Krijoni klasën Product, në të cilën
do të ketë vetitë e mëposhtme: name,
price.
Krijoni një objekt të klasës Product, shkruajeni
atë në ndryshoren $product1.
Caktoni vlerën e ndryshores $product1
në ndryshoren $product2. Kontrolloni
që të dyja ndryshoret referohen në të njëjtin
objekt.