PHP да ООПда объектларга reference орқали ўтказиш
Фарз қилайлик, бизда User номли шундай класс бор:
<?php
class User
{
public $name;
public $age;
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
}
?>
Фарз қилайлик, биз бу классдан объект яратамиз:
<?php
$user = new User('john', 30);
?>
Энди куйидаги вазиятни тасаввур қилинг: сиз
$user ўзгарувчисининг қийматини
бошқа бир ўзгарувчига, масалан
$test га тенглаштирмоқчисиз.
Агар объектлар ҳақида эмас, балки примитивлар
ҳақида гапирсак, яъни сатрлар, сонлар, массивлар ва ҳ.к,
унда $test ўзгарувчисига
$user ўзгарувчисининг қийматининг нусхаси ўтган бўлур эди.
Бунинг маъноси, кейинчалик ўзгарувчиларнинг биронтасини ўзгартириш иккинчи ўзгарувчининг қийматини ўзгартирмасди. Куйидаги мисолга кўзам:
<?php
$user = 1;
$test = $user; // $test ўзгарувчисида энди 1
$test = 2; // $test ўзгарувчисида энди 2, $user да эса 1 қолади
?>
Объектлар билан бошқача - иккинчи ўзгарувчига ёзганда объектлар нусхаланмайди, балки reference орқали ўтказилади: бунинг маъноси, бу икки ўзгарувчининг қиймати битта ва худди шу объектдир. Бу мухим оқибатга эга: агар объектнинг қандайдир хоссаларини бирор ўзгарувчи ёрдамида ўзгартирилса, иккинчи ўзгарувчида худди шу ўзгаришлар пайдо бўлади.
Келиб, амалиётда кўриб чиқайлик. Фойдаланувчи билан объект яратайлик:
<?php
$user = new User('john', 30);
?>
Объектни бошқа ўзгарувчига тенглаштирамиз:
<?php
$test = $user;
?>
$test ўзгарувчисида
name хоссасини ўзгартирамиз
<?php
$test->name = 'eric';
?>
Келиб, умумий объект ўзгарганини текшириб кўрамиз.
$user ўзгарувчисидан
name хоссасини чиқарайлик:
<?php
echo $user->name; // 'eric' чиқади!
?>
Product классни яратинг, унда
куйидаги хоссалар бўлсин: name,
price.
Product классидан объект яратиб,
уни $product1 ўзгарувчисига ёзинг.
$product1 ўзгарувчисининг қийматини
$product2 ўзгарувчисига тенглаштиринг. Иккала
ўзгарувчи ҳам битта объектга ишорат қилаётиганини текшириб кўринг.