PHP-তে OOP-তে রেফারেন্স দ্বারা অবজেক্ট পাস করা
ধরুন আমাদের এখানে 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 আছে
?>
অবজেক্টের ক্ষেত্রে বিষয়টি ভিন্ন - যখন অন্য একটি ভেরিয়েবলে অ্যাসাইন করা হয়, অবজেক্টগুলি কপি হয় না, বরং রেফারেন্স দ্বারা পাস করা হয়: এর মানে হল যে এই উভয় ভেরিয়েবলের মান হিসাবে একই অবজেক্ট থাকে। এর একটি গুরুত্বপূর্ণ ফলাফল আছে: যদি একটি ভেরিয়েবল ব্যবহার করে অবজেক্টের কোনো প্রপার্টি পরিবর্তন করা হয়, দ্বিতীয় ভেরিয়েবলেও একই পরিবর্তন দেখা যাবে।
আসুন অনুশীলনে দেখি। ইউজার নিয়ে একটি অবজেক্ট তৈরি করি:
<?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 ভেরিয়েবলে অ্যাসাইন করুন। পরীক্ষা করুন
যে উভয় ভেরিয়েবল একই অবজেক্টকে রেফার করছে।