Объекттерди 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
?>

Объекттер менен башкача - башка өзгөрмөгө жазганда объекттер көчүрүлбөйт, ал эми шилтеме аркылуу берилет: бул мындай дегенди билдирет: бул экөө тең өзгөрмөлөр бир эле объектти маани кылып алышат. Бул маанилүү натыйжага ээ: эгерде объекттин кандайдыр бир касиеттерин бир өзгөрмө менен өзгөртсөңүз, экинчи өзгөрмөдө ошол эле өзгөрүүлөр пайда болот.

Келгиле, иш жүзүндө көрөлү. Колдонуучу менен объект түзөлү:

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 өзгөрмөсүнө ыйгарыңыз. Экөө тең өзгөрмөлөр бир эле объектке шилтеме жасаганын текшериңиз.