Օբյեկտների փոխանցում հղումով OOP-ում PHP-ում

Ենթադրենք ունենք User դասը.

User.php<?php
  class User
  {
    public $name;
    public $age;
    
    public function __construct($name, $age)
    {
      $this->name = $name;
      $this->age  = $age;
    }
  }
?>

Ենթադրենք ստեղծում ենք այս դասի օբյեկտ.

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

Այժմ պատկերացրեք հետևյալ իրավիճակը՝ ցանկանում եք $user փոփոխականի արժեքը վերագրել մեկ այլ փոփոխականի, օրինակ՝ $test-ի:

Եթե խոսքը ոչ թե օբյեկտների, այլ պրիմիտիվների մասին էր, այսինքն՝ տողերի, թվերի, զանգվածների և այլնի, ապա $test փոփոխականին կանցներ $user փոփոխականի արժեքի պատճենը:

Սա նշանակում է, որ ապագայում որևէ փոփոխականի փոփոխությունները չէին փոխի մյուս փոփոխականի արժեքը: Տեսնենք օրինակով.

index.php<?php
  $user = 1;
  
  $test = $user; // $test փոփոխականում այժմ 1 է
  $test = 2;     // $test փոփոխականում այժմ 2 է, իսկ $user-ում՝ դեռ 1
?>

Օբյեկտների դեպքում այլ է՝ այլ փոփոխականին վերագրելիս օբյեկտները չեն պատճենվում, այլ փոխանցվում են հղումով. սա նշանակում է, որ այդ երկու փոփոխականներն էլ որպես արժեք ունեն մեկ և նույն օբյեկտը: Սա կարևոր հետևանք ունի. եթե օբյեկտի որոշ հատկություններ փոխվեն մեկ փոփոխականի միջոցով, ապա երկրորդ փոփոխականում կհայտնվեն նույն փոփոխությունները:

Տեսնենք գործնականում: Ստեղծենք օբյեկտ user-ով.

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

Օբյեկտը վերագրենք մեկ այլ փոփոխականի.

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

Փոխենք name հատկությունը $test փոփոխականում:

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

Ստուգենք, որ փոխվել է ընդհանուր օբյեկտը: Դուրս բերենք name հատկությունը $user փոփոխականից.

index.php<?php
  echo $user->name; // կարտածի 'eric'!
?>
Задание 1

Ստեղծեք Product դաս, որում կլինեն հետևյալ հատկությունները՝ name, price:

Задание 2

Ստեղծեք Product դասի օբյեկտ, գրեք այն $product1 փոփոխականում:

Задание 3

$product1 փոփոխականի արժեքը վերագրեք $product2 փոփոխականին: Ստուգեք, որ երկու փոփոխականներն էլ հղվում են մեկ և նույն օբյեկտին: