কম্পিউটার টিউটোরিয়াল

PHP রেফারেন্স দিয়ে পাসিং (Passing by Reference)


পরিচিতি

PHP-তে, ফাংশনের আর্গুমেন্ট ভ্যালু দিয়ে (by value) বা রেফারেন্স দিয়ে (by reference) পাস করা যায়। ডিফল্টভাবে, একচুয়াল আর্গুমেন্টের ভ্যালু ফরমাল আর্গুমেন্টে ভ্যালু দিয়ে পাস হয় যা ফাংশন ভেতরে লোকাল ভেরিয়েবল হয়ে যায়। তাই এই ভেরিয়েবলগুলো মডিফাই করলে একচুয়াল আর্গুমেন্ট ভেরিয়েবলের মান পরিবর্তন হয় না।

যখন আর্গুমেন্ট রেফারেন্স দিয়ে পাস করা হয়, ফরমাল আর্গুমেন্টের মান পরিবর্তন একচুয়াল আর্গুমেন্ট ভেরিয়েবলে রিফলেক্ট হয় কারণ ফরমালটি একচুয়ালটির রেফারেন্স। তাই পাস বাই রেফারেন্স মেকানিজম গ্লোবাল স্পেসে ডেটা ইনডায়রেক্টলি ম্যানিপুলেট করতে সাহায্য করে। এটি ফাংশন শুধু একটি ভেরিয়েবল রিটার্ন করতে পারে সেটি অতিক্রম করতেও সাহায্য করে।

পাস বাই ভ্যালু (Pass by Value)

নিচের উদাহরণে, দুটি ভেরিয়েবল swap() ফাংশনে পাস করা হয়েছে। ফাংশন ভেতরে সওয়াপিং মেকানিজম হলেও পাস করা ভেরিয়েবলগুলোর মান পরিবর্তন হয় না—

উদাহরণ

<?php
function swap($arg1, $arg2){
    echo "inside function before swapping: arg1=$arg1 arg2=$arg2\n";
    $temp=$arg1;
    $arg1=$arg2;
    $arg2=$temp;
    echo "inside function after swapping: arg1=$arg1 arg2=$arg2\n";
}
$arg1=10;
$arg2=20;
echo "before calling function : arg1=$arg1 arg2=$arg2\n";
swap($arg1, $arg2);
echo "after calling function : arg1=$arg1 arg2=$arg2\n";
?>

আউটপুট

এই উদাহরণ নিচের আউটপুট দেবে—

before calling function : arg1=10 arg2=20
inside function before swapping: arg1=10 arg2=20
inside function after swapping: arg1=20 arg2=10
after calling function : arg1=10 arg2=20

পাস বাই রেফারেন্স (Pass by reference)

রেফারেন্স দিয়ে আর্গুমেন্ট রিসিভ করতে ফরমাল আর্গুমেন্ট হিসেবে ব্যবহৃত ভেরিয়েবল & সিম্বল দিয়ে প্রিফিক্স করতে হয়। এটি কলিং ফাংশনে ব্যবহৃত ভেরিয়েবলগুলোকে রেফারেন্স করে। তাই ফাংশন ভেতরে সওয়াপিংয়ের ফলাফল আসল পাস করা ভেরিয়েবলগুলোটেও রিফলেক্ট হবে।

উদাহরণ

<?php
function swap(&$arg1, &$arg2){
    echo "inside function before swapping: arg1=$arg1 arg2=$arg2\n";
    $temp=$arg1;
    $arg1=$arg2;
    $arg2=$temp;
    echo "inside function after swapping: arg1=$arg1 arg2=$arg2\n";
}
$arg1=10;
$arg2=20;
echo "before calling function : arg1=$arg1 arg2=$arg2\n";
swap($arg1, $arg2);
echo "after calling function : arg1=$arg1 arg2=$arg2\n";
?>

আউটপুট

সওয়াপিংয়ের ফলাফল নিচে দেখানো হলো—

before calling function : arg1=10 arg2=20
inside function before swapping: arg1=10 arg2=20
inside function after swapping: arg1=20 arg2=10
after calling function : arg1=20 arg2=10

নিচের উদাহরণে, অ্যারে এলিমেন্টগুলো আলাদা ভেরিয়েবলসের রেফারেন্স যেগুলো অ্যারে ইনিশিয়ালাইজেশনের আগে ডিক্লেয়ার করা হয়েছে। যদি এলিমেন্ট মডিফাই করা হয়, তবে ভেরিয়েবলগুলোও চেঞ্জ হয়—

উদাহরণ

<?php
$a = 10;
$b = 20;
$c=30;
$arr = array(&$a, &$b, &$c);
for ($i=0; $i<3; $i++) $arr[$i]++;
echo "$a $b $c";
?>

আউটপুট

$a, $b এবং $c-র মানও ইনক্রিমেন্ট হয়েছে—

11 21 31

এক অ্যারে ফাংশনে রেফারেন্স দিয়ে পাস করাও সম্ভব—

উদাহরণ

<?php
function arrfunction(&$arr){
    for ($i=0;$i<5;$i++)
        $arr[$i]=$arr[$i]+10;
}
$arr=[1,2,3,4,5];
arrfunction($arr);
foreach ($arr as $i) echo $i . " ";
?>

আউটপুট

মডিফাইড অ্যারে নিচে দেখানো হলো—

11 12 13 14 15

অবজেক্ট এবং রেফারেন্স (Object and reference)

PHP-তে অবজেক্ট ডিফল্টভাবে রেফারেন্স দিয়ে পাস হয়। যখন অবজেক্টের একটি রেফারেন্স তৈরি করা হয়, তবে এর রেফারেন্স আর্গুমেন্ট হিসেবে $this রূপেও পাস হয় যা প্রথম অবজেক্টের রেফারেন্স।

উদাহরণ

<?php
class test1{
    private $name;
    function getname(){
        return $this->name;
    }
    function setname($name){
        $this->name=$name;
    }
}
$obj1=new test1();
$obj2=&$obj1;
$obj1->setname("Amar");
echo "name: " .$obj2->getname();
?>

আউটপুট

উপরের কোড নিচের আউটপুট দেবে—

name: Amar

  1. PHP min() ফাংশন

  2. PHP max() ফাংশন

  3. PHP log10() ফাংশন

  4. PHP log() ফাংশন