Kalimi i objekteve me referencë në OOP në PHP

Le të kemi klasën User si më poshtë:

User.php<?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:

index.php<?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:

index.php<?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:

index.php<?php
  $user = new User('john', 30);
?>

Le ta caktojmë objektin në një ndryshore tjetër:

index.php<?php
  $test = $user;
?>

Le të ndryshojmë vetinë name në ndryshoren $test

index.php<?php
  $test->name = 'eric';
?>

Le të kontrollojmë nëse ka ndryshuar objekti i përbashkët. Le të shfaqim vetinë name nga ndryshorja $user:

index.php<?php
  echo $user->name; // do të shfaqë 'eric'!
?>
Задание 1

Krijoni klasën Product, në të cilën do të ketë vetitë e mëposhtme: name, price.

Задание 2

Krijoni një objekt të klasës Product, shkruajeni atë në ndryshoren $product1.

Задание 3

Caktoni vlerën e ndryshores $product1 në ndryshoren $product2. Kontrolloni që të dyja ndryshoret referohen në të njëjtin objekt.