PHP Variable পর্ব-৪: Reference Variable

এই পর্বে আপনি জানতে পারবেন :

Reference Variable

PHP Reference Variable কি ?

PHP Reference Variable হচ্ছে কোনো একটা নির্দিষ্ট variable এর value বা content এ ভিন্ন ভিন্ন Variable নামে ব্যবহার করতে পারা। অনেকটা Windows OS এর Shortcut Links অথবা Linux OS এর Symbolic Links এর মতো। PHP তে Reference ঘোষণা করতে হলে , Variable এর সামনে একটা & চিহ্ন (ampersand sign) দিতে হয়।

Zend Certified PHP Engineering (ZCPE) Course

PHP তে Reference Variable দিয়ে আমরা কি করতে পারি?

PHP তে Reference ব্যবহার করে আমরা তিনটি মৌলিক কাজ করতে পারি

  • Assigning by Reference বা একই content বা value তে দুইটি variable কে assign বা নির্ধারিত করা
  • Passing by Reference বা Reference দিয়ে কোনো Variable কে function এ পাঠানো
  • Returning References বা function থেকে Reference Return করা।

Assigning by Reference কি?

PHP তে যখন একই content বা value এর জন্য দুইটি variable কে assign বা নির্ধারিত করা হয় , PHP এর পরিভাষায় একে বলা হয় Assigning by Reference. নিচের উদাহরণ থেকে আরেকটু ভালো ভাবে বুঝে নেয়া যাক

<?php
$a = "Hi there";
$b = $a;
$b = "See you later";
echo $a; // Displays "Hi there"
echo $b; // Displays "See you later"
?>

ব্যাখ্যা: উপরের কোডে $a varible কে $b তে assign বা নির্দিষ্ট করার পর ও $a এবং $b দুইটি সম্পূর্ণ স্বাধীন দুইটি ভ্যারিয়েবল। এবং দুইটি ভ্যারিয়েবলের Output বা ফলাফল সম্পূর্ণ ভিন্ন। $b ভ্যারিয়েবল তার সর্বশেষ Value “See you later” ই ফলাফল হিসাবে দেখাচ্ছে। $a variable এর value হিসাবে “Hi There” দেখাচ্ছেনা। এখন আমরা যদি $a variable কে $b এর সাথে reference করে দেই, তাহলে $a এবং $b দুটি variable ই সবসময় একই value ধারণ করবে।
চলুন নিচের উদাহরণ থেকে বুঝে নেয়া যাক :

<?php
$a = "Hi there";
$b = &$a;
$b = "See you later";
echo $a; // Displays "See you later"
echo $b; // Displays "See you later"
?>

ব্যাখ্যা:শুধু মাত্র reference এর কারণে আমরা দুইটা Variable এর Value সব সময় একই পাবো। আবার $a এর Value যদি পরিবর্তন করেন , তাহলে $b এর value ও পরিবর্তন হয়ে যাবে। নিচের উদাহরণ লক্ষ্য করুন :

Zend Certified PHP Engineering (ZCPE) Course


<?php
$a = "Hi there";
$b = &$a;
$b = "See you later";
$a="GoodBye!";
echo $a; // Displays "GoodBye!"
echo $b; // Displays "GoodBye!"

Passing by Reference কি?

PHP তে Reference দিয়ে যখন কোনো Variable কে function এ পাঠানো হয়। তখন তাকে বলা হয় Passing By Reference. আর এই কাজটি করতে হলে আপনাকে PHP তে Function Define করার সময় Parameter এর আগে একটা & চিহ্ন (ampersand sign) দিতে হয়। আর এতে সুবিধা হচ্ছে function এর ভিতরে Parameter এর Value পরিবর্তন হওয়ার সাথে সাথে আপনার পাঠানো Variable টির Value ও পরিবর্তন হয়ে যাবে । নিচের উদাহরণ থেকে দেখা যাক।

function goodbye( &$greeting ) {
  $greeting = "See you later";
}
 
$myVar = "Hi there";
goodbye( $myVar );
echo $myVar; // Displays "See you later"

ব্যাখ্যা:লক্ষ্য করুন Function এর ভিতরের Parameter $greeting এর Value “See you Later” হওয়াতে Function এর বাহিরের Variable $myVar এর Value “Hi there” এর পরিবর্তে “See you later ” হয়ে গেছে।

আরো একটা উদাহরণ দেখি :

<?php
function foo(&$var)
{
    $var++;
}

$a=5;
foo($a);
echo  $a; // $a is 6 here
?>

ব্যাখ্যা:এখানেও একইভাবে Function এর ভিতরের Parameter $varএর Value Increment হওয়াতে Function এর বাহিরের Variable $aএর Value 5 এর পরিবর্তে 6 হয়ে গেছে।

Zend Certified PHP Engineering (ZCPE) Course

Returning References কি?

PHP তে Reference সহ যখন কোনো Variable কে function থেকে return বা প্রত্যাবর্তন করা হয় । তখন তাকে বলা হয় Returning By Reference. আর এই কাজটি করতে হলে আপনাকে PHP তে function এর নামের আগে একটা & চিহ্ন (ampersand sign) দিতে হবে। সেই সাথে আপনি যখন কোনো variable এ function call করবেন, তখনও (=) চিহ্ন (equal sign) এর সাথে একটা & চিহ্ন (ampersand sign) দিতে হবে। আর এতে সুবিধা হচ্ছে আপনি যেই variable এর মধ্যে function টি call করলেন , সেই variable এর value পরিবর্তন হলে function এর return value ও পরিবর্তন হয়ে যাবে। । নিচের উদাহরণ থেকে দেখা যাক।

<?php
$a = 10;
 
function &test() {
  global $a;
  return $a;
}
 
$b =&test();
$b--;
echo "\$a = $a<br>";  // Displays "9"
echo "\$b = $b<br>";  // Displays "9"
?>

ব্যাখ্যা:লক্ষ্য করুন এখানে $b এর মান পরিবর্তন হওয়ার সাথে সাথে $a এর মান ও পরিবর্তন হয়ে গেছে। আর এটা সম্ভব হয়েছে Returning by Reference এর কারণে।

PHP তে Reference দিয়ে কি array অথবা object এ কাজ করা যায়?

হাঁ PHP তে Reference দিয়ে array অথবা object এর property গুলোর value খুব সহজে পরিবর্তন করে দেয়া যায়। সেক্ষেত্রে আপনাকে foreach loop এর আশ্রয় নিতে হবে। নিচের উদাহরণ দুইটি লক্ষ্য করুন :

$bands = array( "The Who", "The Beatles", "The Rolling Stones" );
 
foreach ( $bands as $band ) {
  $band = strtoupper( $band );
}
 
echo "<pre>";
print_r( $bands );
echo "</pre>";

উপরের উদাহরণের ফলাফল নিচের মত করে দেখাবে :

Array
(
    [0] => The Who
    [1] => The Beatles
    [2] => The Rolling Stones
)

এখানে আমরা দেখতে পাচ্ছি strtoupper function টি আমাদের কোনো কাজে আসতেছেনা, এখন আমরা যদি $bands array কে $band এর সাথে reference করে দেই, তাহলে $bands array এর সব গুলো value ই uppercase এ রূপান্তর হয়ে যাবে। নিচের উদাহরণ লক্ষ্য করুন :

$bands = array( "The Who", "The Beatles", "The Rolling Stones" );
 
foreach ( $bands as &$band ) {
  $band = strtoupper( $band );
}
 
echo "<pre>";
print_r( $bands );
echo "</pre>";

নিচে পরিবর্তন লক্ষ্য করুন, সবগুলো Array Property এর value Uppercase এ পরিবর্তন হয়েগেছে।

Zend Certified PHP Engineering (ZCPE) Course

Array
(
    [0] => THE WHO
    [1] => THE BEATLES
    [2] => THE ROLLING STONES
)

আমরা কোথায় কোথায় PHP Reference Variable ব্যবহার করতে পারি।

নির্দিষ্ট প্রোগ্রামিং লক্ষ্য অর্জনের জন্য আমরা বিভিন্ন পরিস্থিতিতে PHP reference variables ব্যবহার করতে পারেন। এখানে কিছু common use cases রয়েছে যেখানে reference variables গুলি আমাদের কাজকে সহজ করতে পারে:

১. Function Parameter Passing:

আপনি যদি ফাংশনটি মূল ভেরিয়েবলের মান সরাসরি পরিবর্তন করতে চান তবে ফাংশনে আর্গুমেন্ট পাস করার সময় আপনি reference variables ব্যবহার করতে পারেন। এটি বিশেষভাবে কার্যকর যখন আপনাকে একটি ফাংশন থেকে একাধিক value ফেরত দিতে হবে।

কল্পনা করুন যে আপনি একটি বইয়ের দোকানের জন্য একটি ওয়েব অ্যাপ্লিকেশন তৈরি করছেন এবং আপনি এমন একটি ফাংশন তৈরি করতে চান যা একটি গ্রাহকের অর্ডারের total price ক্যালকুলেট করে এবং যেকোনো available discounts প্রয়োগ করে। আপনি ফাংশনটি total price এবং প্রয়োগকৃত discounts লিস্ট উভয়ই রিটার্ন করতে চান।

এখানে একটি উদাহরণ:

<?php
// Function to calculate the total price and applied discounts
function calculateTotalPriceWithDiscounts($cart, &$appliedDiscounts) {
    $totalPrice = 0;
    $appliedDiscounts = [];

    foreach ($cart as $item) {
        $price = $item['price'];
        $quantity = $item['quantity'];
        $subtotal = $price * $quantity;

        // Apply a discount for specific items
        if ($item['isDiscounted']) {
            $discount = $subtotal * 0.1; // 10% discount
            $totalPrice += $subtotal - $discount;

            // Record the applied discount
            $appliedDiscounts[] = [
                'item' => $item['name'],
                'discount' => $discount,
            ];
        } else {
            $totalPrice += $subtotal;
        }
    }

    return $totalPrice;
}

// Sample shopping cart data
$shoppingCart = [
    ['name' => 'Book A', 'price' => 20.99, 'quantity' => 2, 'isDiscounted' => false],
    ['name' => 'Book B', 'price' => 15.49, 'quantity' => 1, 'isDiscounted' => true],
    ['name' => 'Book C', 'price' => 10.99, 'quantity' => 3, 'isDiscounted' => false],
];

// Initialize an array to store applied discounts
$discountsApplied = [];

// Calculate the total price with discounts
$totalPrice = calculateTotalPriceWithDiscounts($shoppingCart, $discountsApplied);

echo "Total Price: $totalPrice<br>";

// Display applied discounts
echo "Applied Discounts:<br>";
foreach ($discountsApplied as $discount) {
    echo "{$discount['item']} received a discount of {$discount['discount']}<br>";
}

এই বাস্তব বিশ্বের উদাহরণে:

  • আমরা একটি ফাংশন calculateTotalPriceWithDiscounts ডিফাইন করি যা একটি shopping cart এর আইটেমগুলির total price ক্যালকুলেট করে, এবং নির্দিষ্ট আইটেমগুলিতে discount প্রয়োগ করে এবং একটি reference variable $appliedDiscounts ব্যবহার করে প্রয়োগকৃত ডিসকাউন্টগুলির ট্র্যাক রাখে৷
  • ফাংশনটি একটি input array $cart হিসাবে shopping cart এ ডেটা নেয় এবং প্রয়োগকৃত ডিসকাউন্ট তথ্য সংরক্ষণ করতে একটি empty array $appliedDiscounts ভ্যারিয়েবল ইনিশিয়ালাইজ করে।
  • ফাংশনের ভিতরে, আমরা cart এর প্রতিটি item কে loop করি, subtotal ক্যালকুলেট করি এবং ডিসকাউন্ট (‘isDiscounted’ => true) হিসাবে চিহ্নিত আইটেমগুলির জন্য 10% ছাড় প্রয়োগ করি।
  • আমরা $appliedDiscounts অ্যারেতে প্রয়োগকৃত ডিসকাউন্ট রেকর্ড করি।
  • ফাংশনটি total price রিটার্ন করবে , এবং প্রয়োগকৃত ডিসকাউন্টগুলি ফাংশন কলের পরে reference variable এর সুবাধে $discountsApplied অ্যারেতে পাওয়া যাবে ।

এই উদাহরণটি দেখায় যে আমরা কীভাবে একটি complex data structure (the shopping cart) প্রসেস করার সময় একটি ফাংশন থেকে একাধিক মান (total price এবং applied discounts) পাস এবং সংশোধন করতে reference variables ব্যবহার করতে পারি।

২. Modifying Elements in Arrays or Objects:

আপনি যখন Arrays বা object গুলোর মধ্যে অবস্থিত element গুলি সরাসরি পরিবর্তন করতে চান, বিশেষ করে nested structure এর মধ্যে, reference variable আপনাকে ডেটার কপি তৈরি করা এড়াতে অনুমতি দেয়।

আসুন একটি real-world উদাহরণ বিবেচনা করি যেখানে আপনি সরাসরি employee record এর একটি অ্যারের মধ্যে element গুলি পরিবর্তন করতে চান, বিশেষ করে nested structure গুলোর মধ্যে। এক্ষেত্রে ডেটার কপি তৈরি করা এড়াতে আপনি reference variables ব্যবহার করতে পারেন এবং দক্ষতার সাথে employee information আপডেট করতে পারেন।

ধরুন আপনার কাছে employee records এর একটি অ্যারে আছে, এবং আপনি এমন একটি ফাংশন বাস্তবায়ন করতে চান যা একটি নির্দিষ্ট ডিপার্মেন্টের সমস্ত কর্মচারীদের বেতন একটি নির্দিষ্ট শতাংশ দ্বারা বৃদ্ধি করে।

নিম্নের উদাহরণটি লক্ষ্য করুন:

<?php
// Function to increase salaries of employees in a specific department
function increaseSalariesInDepartment(&$employeeData, $department, $percentageIncrease) {
    foreach ($employeeData as &$employee) {
        if ($employee['department'] === $department) {
            $employee['salary'] *= (1 + $percentageIncrease / 100);
        }
    }
}

// Sample employee data
$employeeData = [
    ['name' => 'Alice', 'department' => 'HR', 'salary' => 50000],
    ['name' => 'Bob', 'department' => 'IT', 'salary' => 60000],
    ['name' => 'Charlie', 'department' => 'HR', 'salary' => 55000],
    ['name' => 'David', 'department' => 'Finance', 'salary' => 65000],
];

// Increase salaries for employees in the HR department by 5%
$departmentToIncrease = 'HR';
$percentageIncrease = 5;
increaseSalariesInDepartment($employeeData, $departmentToIncrease, $percentageIncrease);

// Display updated employee data
echo "Updated Employee Data:<br>";
foreach ($employeeData as $employee) {
    echo "{$employee['name']} ({$employee['department']}): {$employee['salary']}<br>";
}

এই real-world উদাহরণে:

  • আমরা increaseSalariesInDepartment নামক একটি ফাংশন কে সংজ্ঞায়িত করি যা একটি reference variable (&$employeeData) হিসাবে employee ডেটার একটি array নেয়, এর জন্য target করা হয় department এর name এবং salary গুলিতে প্রয়োগের percentage increase.
  • ফাংশনের ভিতরে, আমরা employee ডেটার মাধ্যমে iterate করি। যখন আমরা নির্দিষ্ট ডিপার্টমেন্টে একজন employee খুঁজে পাই, তখন আমরা সরাসরি তাদের বেতন সংশোধন করি এবং উপযুক্ত গুণক দ্বারা গুণ করে নির্দিষ্ট percentage দ্বারা বৃদ্ধি করি।
  • আমরা $employeeData অ্যারেতে sample employee ডেটা সংরক্ষিত আছে।
  • HR department এর employee দের বেতন 5% বৃদ্ধি করার জন্য আমরা increaseSalariesInDepartment ফাংশনকে কল করি।
  • পরিশেষে, আমরা বেতনের পরিবর্তনগুলি দেখতে updated employee ডেটা প্রদর্শন করি।

এই উদাহরণটি দেখায় কিভাবে reference variable গুলিকে ডেটার কপি তৈরি করার প্রয়োজন ছাড়াই complex data structures এর অ্যারেগুলির মধ্যে elements গুলিকে দক্ষতার সাথে পরিবর্তন করতে ব্যবহার করা যেতে পারে, যেমন employee records.

৩.Swap Values:

আপনি যখন একটি temporary variable ব্যবহার না করে দুটি ভেরিয়েবলের মান swapping অর্থাৎ অদলবদল করতে চান, আপনি reference variable ব্যবহার করে তা করতে পারেন।

একটি temporary variable ব্যবহার না করে দুটি ভেরিয়েবলের মান অদলবদল করা একটি common programming task. আপনি PHP reference variables ব্যবহার করে এটি অর্জন করতে পারেন। আসুন একটি real-world উদাহরণ বিবেচনা করি যেখানে আপনাকে একটি array তে দুটি elements এর অবস্থান অদলবদল করতে হতে পারে।

ধরুন আপনার কাছে ছাত্রদের একটি array আছে, এবং আপনি তাদের আইডির উপর ভিত্তি করে array তে দুটি ছাত্রের অবস্থান অদলবদল করতে চান। reference variables ব্যবহার করে আপনি কীভাবে এটি করতে পারেন তা নিম্নে দেখানো হলো :

<?php
// Function to swap two students in an array by their IDs
function swapStudentsByID(&$students, $id1, $id2) {
    $index1 = null;
    $index2 = null;

    // Find the indices of the students with the given IDs
    foreach ($students as $index => &$student) {
        if ($student['id'] === $id1) {
            $index1 = $index;
        } elseif ($student['id'] === $id2) {
            $index2 = $index;
        }

        // If both indices are found, break the loop early
        if ($index1 !== null && $index2 !== null) {
            break;
        }
    }

    // Check if both students with the given IDs were found
    if ($index1 !== null && $index2 !== null) {
        // Use reference variables to swap the students
        $temp = $students[$index1];
        $students[$index1] = $students[$index2];
        $students[$index2] = $temp;
    }
}

// Sample array of students
$students = [
    ['id' => 101, 'name' => 'Alice'],
    ['id' => 102, 'name' => 'Bob'],
    ['id' => 103, 'name' => 'Charlie'],
    ['id' => 104, 'name' => 'David'],
];

// Swap the positions of students with IDs 102 and 103
$id1 = 102;
$id2 = 103;
swapStudentsByID($students, $id1, $id2);

// Display the updated array of students
foreach ($students as $student) {
    echo "ID: {$student['id']}, Name: {$student['name']}<br>";
}

এই real-world উদাহরণে:

  • আমরা একটি ফাংশন swapStudentsByID সংজ্ঞায়িত করি যা একটি reference variable (&$students) হিসাবে ছাত্রদের একটি array নেয়, সেইসাথে অদলবদল করা দুটি ছাত্রের আইডি।
  • ফাংশনের অভ্যন্তরে, আমরা নির্দিষ্ট আইডি সহ student দের indices গুলি খুঁজে পেতে শিক্ষার্থীদের array এর মাধ্যমে iterate করি।
  • একবার আমাদের উভয় indices পেয়ে গেলে, আমরা array এর ছাত্রদের অবস্থান অদলবদল (swapping) করতে reference variable ব্যবহার করি।
  • আমাদের কাছে $students array তে সঞ্চিত students দের একটি sample array আছে।
  • আইডি 102 এবং 103 সহ students দের অবস্থান অদলবদল (swapping) করতে আমরা swapStudentsByID ফাংশনকে কল করি।
  • সবশেষে , students দের (swapping) অদলবদল করা হয়েছে তা নিশ্চিত করতে আমরা students দের আপডেট করা array প্রদর্শন করি।

এই উদাহরণটি দেখায় কিভাবে reference variables দুটি ভেরিয়েবলের মান অদলবদল (swapping) করতে ব্যবহার করা যেতে পারে, এই ক্ষেত্রে, একটি array তে দুটি student এর অবস্থান, একটি temporary variable এর প্রয়োজন ছাড়াই।

৪. Avoiding Copy Overhead:

arrays বা object এর মতো বড় ডেটা স্ট্রাকচারের সাথে কাজ করার সময়, references ব্যবহার করা সেই স্ট্রাকচারের কপি তৈরি করার চেয়ে বেশি memory-efficient হতে পারে।

আসুন একটি real-world উদাহরণ বিবেচনা করি যেখানে আপনি products গুলির একটি বড় ডেটাসেট প্রসেস করতে চান এবং আপনি references ব্যবহার করে অপ্রয়োজনীয় মেমরি ওভারহেড এড়াতে বিভিন্ন category অনুযায়ী প্রোডাক্টের total cost ক্যালকুলেট করতে চান।

ধরুন আপনার কাছে প্রোডাক্টের একটি ডেটাসেট রয়েছে, প্রতিটিতে তার ক্যাটাগরি রয়েছে এবং আপনি প্রোডাক্ট ডেটার কোনো ধরণের কপি না করে প্রতিটি ক্যাটাগরির জন্য total cost ক্যালকুলেট করতে চান। PHP reference variables ব্যবহার করে আপনি কীভাবে এটি করতে পারেন তা নিম্নে দেখানো হলো :

<?php
// Function to calculate total cost by category
function calculateTotalCostByCategory($products, &$totalCosts) {
    foreach ($products as $product) {
        $category = $product['category'];
        $price = $product['price'];

        // Use references to avoid copying data
        $totalCosts[$category] += $price;
    }
}

// Sample dataset of products
$products = [
    ['name' => 'Product A', 'category' => 'Electronics', 'price' => 500],
    ['name' => 'Product B', 'category' => 'Clothing', 'price' => 120],
    ['name' => 'Product C', 'category' => 'Electronics', 'price' => 300],
    // ... (many more products)
];

// Initialize an array to store total costs by category
$totalCosts = [];

// Calculate the total cost by category without copying data
calculateTotalCostByCategory($products, $totalCosts);

// Display the total cost by category
foreach ($totalCosts as $category => $cost) {
    echo "Total cost in $category: $cost<br>";
}

এই real-world উদাহরণে:

  • আমরা একটি ফাংশন calculateTotalCostByCategory সংজ্ঞায়িত করি যা প্রতিটি category এর জন্য total cost সংরক্ষণ করতে ইনপুট ($products) এবং reference দ্বারা একটি array ($totalCosts) হিসাবে products গুলির একটি array নেয়৷
  • ফাংশনের ভিতরে, আমরা products গুলির মাধ্যমে iterate করি। প্রতিটি product এর জন্য, আমরা তার category এবং price retrieve করি।
  • references ব্যবহার করে, আমরা product ডেটার কপি না করেই $totalCosts array তে সংশ্লিষ্ট category এর total cost আপডেট করি।
  • আমাদের কাছে $products array তে সংরক্ষিত products এর একটি sample dataset আছে।
  • আমরা একটি খালি array ইনিশিয়ালাইজ করি, $totalCosts ভ্যারিয়েবল এ , category অনুযায়ী total costs সংরক্ষণ করতে।
  • আমরা calculateTotalCostByCategory ফাংশনকে বলি, যা product ডেটার অতিরিক্ত কপি তৈরি না করেই category অনুযায়ী total cost ক্যালকুলেট করে।
  • ফাইনাল্লি, আমরা প্রতিটি category এর জন্য total cost প্রদর্শন করি।

এই উদাহরণে references ব্যবহার করে বড় ডেটাসেটের সাথে কাজ করার সময় মেমরি ওভারহেড এড়াতে সাহায্য করে যাতে আপনি product data কপি না করে total costs আপডেট করতে পারেন।

৫. Recursive Functions:

recursive ফাংশনে, আপনাকে প্রায়ই কল স্ট্যাকের নিচে ডেটা পাস করতে হয় এবং সম্ভাব্যভাবে এটি modify করতে হয় । Reference variable এ এই ধরনের পরিস্থিতিতে data consistency maintain অর্থাৎ ডেটা সামঞ্জস্য বজায় রাখতে সাহায্য করতে পারে।

আসুন একটি real-world উদাহরণ বিবেচনা করি যেখানে reference ভেরিয়েবলের সাহায্যে ডেটা সামঞ্জস্য বজায় রেখে একটি সংখ্যার factorial calculate করার জন্য আপনাকে একটি recursive function ব্যবহার করতে হবে।

একটি non-negative integer n এর ফ্যাক্টরিয়াল হল 1 থেকে n পর্যন্ত সমস্ত positive integer গুলোর গুণফল। আমরা এটি recursively calculate করতে পারি। এখানে একটি উদাহরণ দেওয়া হল:

<?php
// Function to calculate factorial recursively
function calculateFactorial($n, &$result) {
    if ($n == 0) {
        // Base case: factorial of 0 is 1
        $result = 1;
    } else {
        // Recursive case: calculate factorial of (n-1) and multiply by n
        calculateFactorial($n - 1, $result);
        $result *= $n;
    }
}

// Calculate the factorial of a number (e.g., 5)
$number = 5;
$factorialResult = null;

calculateFactorial($number, $factorialResult);

echo "Factorial of $number is: $factorialResult";

এই real-world উদাহরণে:

  • আমরা একটি recursive function calculateFactorial সংজ্ঞায়িত করি যা একটি সংখ্যা n এর factorial ক্যালকুলেট করে। result টি reference ভেরিয়েবল $result এ সংরক্ষণ করা হয়।
  • base case (যখন n 0 হয়), আমরা result টি 1 সেট করি কারণ 0 এর factorial 1 হিসাবে ডিফাইন করা হয়।
  • recursive ক্ষেত্রে, আমরা (n-1) এর factorial কে recursively calculate করি এবং তারপর n এর factorial পেতে এটিকে n দিয়ে গুণ করি।
  • আমরা calculateFactorial ফাংশন কল করে এবং ফলাফল সংরক্ষণ করার জন্য $factorialResult ভেরিয়েবলের একটি reference পাস করে একটি সংখ্যার factorial (এই ক্ষেত্রে, 5) calculate করি।
  • Finally, আমরা factorial result প্রদর্শন করি।

একটি reference ভেরিয়েবল $result ব্যবহার করা recursive ফাংশনে data consistency বজায় রাখতে সাহায্য করে কারণ এটি আমাদের কল স্ট্যাকের ব্যাক আপ মধ্যবর্তী ফলাফল পাস করতে এবং ডেটার অপ্রয়োজনীয় কপি তৈরি না করে চূড়ান্ত ফলাফল তৈরি করতে দেয়। এটি recursion এর সময় ডেটা সামঞ্জস্য বজায় রাখার জন্য recursive ফাংশনে একটি common pattern.

দ্বিতীয় উদাহরণ :

আসুন একটি recursive ফাংশনের আরও একটি বাস্তব উদাহরণ দেখি যা ডেটা সামঞ্জস্য বজায় রাখতে reference ভেরিয়েবল ব্যবহার করে। ধরুন আপনি একটি file management system তৈরি করছেন, এবং আপনি একটি function implement করতে চান যা একটি ডিরেক্টরির total size ক্যালকুলেট করে, এর subdirectory এবং file গুলি সহ।

এই ধরনের একটি recursive ফাংশনের একটি PHP উদাহরণ এখানে:

<?php
// Function to calculate the total size of a directory (including subdirectories and files)
function calculateTotalDirectorySize($directory, &$totalSize) {
    if (is_dir($directory)) {
        $files = scandir($directory);
        foreach ($files as $file) {
            if ($file != '.' && $file != '..') {
                $path = $directory . '/' . $file;
                if (is_dir($path)) {
                    // Recursively calculate the size of subdirectories
                    calculateTotalDirectorySize($path, $totalSize);
                } else {
                    // Add the size of the file to the total
                    $totalSize += filesize($path);
                }
            }
        }
    }
}

// Specify the directory you want to calculate the size of
$targetDirectory = '/path/to/your/directory'; //i.e: For my: D:\software

// Initialize the total size variable
$totalSize = 0;

// Calculate the total size of the directory (including subdirectories and files)
calculateTotalDirectorySize($targetDirectory, $totalSize);

$totalSize/=(1024*1024*1024); //for GB Calculation

//echo "Total size of $targetDirectory: $totalSize bytes";

echo "Total size of $targetDirectory: $totalSize GB";

এই practical উদাহরণে:

  • আমরা একটি recursive function সংজ্ঞায়িত করি calculateTotalDirectorySize যা একটি ডিরেক্টরি পাথ ($directory) এবং একটি reference ভেরিয়েবল $totalSize ডিরেক্টরির ক্রমবর্ধমান সাইজ সংরক্ষণ করে।
  • ফাংশনের ভিতরে, আমরা is_dir ব্যবহার করে প্রদত্ত পাথটি একটি directory কিনা তা পরীক্ষা করি এবং তারপর scandir ব্যবহার করে এর contents গুলো লিস্ট করি।
  • আমরা ডিরেক্টরির মধ্যে file গুলো এবং সাবডিরেক্টরিগুলির মাধ্যমে এবং প্রতিটি আইটেমের জন্য iterate করি:
    • যদি এটি একটি subdirectory হয়, তাহলে আমরা এর সাইজ হিসেব করতে calculateTotalDirectorySize কে recursively কল করি।
    • এটি একটি ফাইল হলে, আমরা $totalSize reference variable এর size যোগ করি।
  • আমরা টার্গেট ডিরেক্টরি নির্দিষ্ট করি যার size আমরা হিসেব করতে চাই ($targetDirectory)।
  • আমরা $totalSize ভেরিয়েবলকে 0 এ initialize করি।
  • আমরা টার্গেট ডিরেক্টরি সহ calculateTotalDirectorySize ফাংশনকে কল করি এবং total size হিসেব করার জন্য $totalSize ভেরিয়েবলের উল্লেখ করি।
  • সবশেষে , আমরা নির্দিষ্ট ডিরেক্টরির total size প্রদর্শন করি।

এই উদাহরণটি দেখায় যে কীভাবে reference variable গুলি একটি recursive ফাংশনে data consistency অর্থাৎ ডেটা সামঞ্জস্য বজায় রাখতে ব্যবহার করা যেতে পারে যা একটি directory এবং এর contents size হিসেব করে, বিশেষত যখন nested directory structures এর সাথে কাজ করে।

৬. Complex Data Manipulation:

এমন পরিস্থিতিতে যেখানে আপনাকে complex data structures ম্যানিপুলেট করতে হবে বা একক পাসে একাধিক elements পরিবর্তন করতে হবে, reference গুলি process কে সহজ করতে পারে।

আসুন একটি real-world উদাহরণ অন্বেষণ করি যেখানে আপনাকে একটি ই-কমার্স প্ল্যাটফর্মের জন্য অর্ডারগুলির একটি তালিকা উপস্থাপন করে একটি complex data structure ম্যানিপুলেট করতে হবে৷ এই পরিস্থিতিতে, আপনি প্রতিটি অর্ডারের জন্য total price হিসেব করতে চান, যেকোনো available discounts প্রয়োগ করতে চান এবং references ব্যবহার করে একটি structured উপায়ে final order এর বিবরণ ট্র্যাক করতে চান।

নিম্নে একটি উদাহরণ দেওয়া হল , যা references ব্যবহার করে complex data manipulation প্রদর্শন করে:

<?php
// Function to calculate the total price for an order
function calculateOrderTotal(&$order) {
    $total = 0;

    foreach ($order['items'] as &$item) {
        $quantity = $item['quantity'];
        $price = $item['price'];
        $subtotal = $quantity * $price;

        // Apply any available discounts
        if (isset($item['discount'])) {
            $discount = $item['discount'];
            $subtotal -= $discount;
        }

        // Update the item's subtotal
        $item['subtotal'] = $subtotal;

        // Add the item's subtotal to the order total
        $total += $subtotal;
    }

    // Update the order's total
    $order['total'] = $total;
}

// Sample order data
$order1 = [
    'id' => 1,
    'items' => [
        ['name' => 'Product A', 'quantity' => 2, 'price' => 20.99, 'discount' => 5.00],
        ['name' => 'Product B', 'quantity' => 1, 'price' => 15.49],
    ],
];

$order2 = [
    'id' => 2,
    'items' => [
        ['name' => 'Product C', 'quantity' => 3, 'price' => 10.99],
    ],
];

// Calculate the total for each order
calculateOrderTotal($order1);
calculateOrderTotal($order2);

// Display the updated order data
echo "Order 1:<br>";
print_r($order1);

echo "Order 2:<br>";
print_r($order2);

এই বাস্তব উদাহরণে:

  • আমরা একটি ফাংশন calculateOrderTotal সংজ্ঞায়িত করি যা একটি order data structure কে একটি reference ($order) হিসাবে নেয় এবং যেকোনো প্রযোজ্য discounts সহ অর্ডারের জন্য total price হিসেবে করে।
  • ফাংশনের ভিতরে, আমরা অর্ডারের আইটেমগুলির মাধ্যমে iterate করি, প্রতিটি আইটেমের সাবটোটাল হিসেব করি এবং যদি সেগুলি বিদ্যমান থাকে তবে ডিসকাউন্ট প্রয়োগ করি। তারপরে আমরা প্রতিটি আইটেমের subtotal আপডেট করি।
  • আমরা পুরো অর্ডারের জন্য একটি running total বজায় রাখি এবং সেই অনুযায়ী অর্ডারের total price আপডেট করি।
  • আমাদের কাছে sample order data আছে যা $order1 এবং $order2 অ্যারে দ্বারা উপস্থাপিত হয়।
  • প্রতিটি অর্ডারের মোট হিসাব করার জন্য আমরা calculateOrderTotal ফাংশনকে কল করি।
  • সবশেষে , আমরা আপডেট করা অর্ডার ডেটা প্রদর্শন করি, যার মধ্যে গণনা করা সাবটোটাল এবং total prices রয়েছে।

এই উদাহরণটি দেখায় যে কীভাবে রেফারেন্স ভেরিয়েবল complex data manipulation কে সহজ করতে পারে আপনাকে সরাসরি অর্ডার ডেটার গঠন আপডেট এবং মেইনটেইন রাখার অনুমতি দিয়ে প্রতিটি অর্ডারের জন্য subtotals এবং totals হিসেব করার সময়।

৭. Efficient Iteration:

একটি array বা object এর মাধ্যমে iterating করার সময় এবং এর elements গুলিতে modifications করার সময়, ডেটা কপি করার চেয়ে reference ব্যবহার করা আরও কার্যকর হতে পারে।

আসুন একটি বাস্তব উদাহরণ বিবেচনা করি যেখানে আপনার কাছে শিক্ষার্থীদের একটি লিস্ট রয়েছে এবং আপনি শিক্ষার্থীদের লিস্টের মাধ্যমে iterating করার সময় তাদের পরীক্ষার স্কোর যোগ করে তাদের চূড়ান্ত গ্রেড হিসেব করতে চান। এই পরিস্থিতিতে references ব্যবহার করা ডেটা copy করার চেয়ে বেশি efficient হতে পারে, বিশেষত অনেক বড় ডেটাসেটের জন্য।

নিম্নের উদাহরণটি লক্ষ্য করুন :

<?php
// Function to calculate final grades for students
function calculateFinalGrades(&$students) {
    foreach ($students as &$student) {
        $totalScore = 0;
        $numberOfTests = count($student['tests']);

        foreach ($student['tests'] as $score) {
            $totalScore += $score;
        }

        // Calculate the average score
        $averageScore = $totalScore / $numberOfTests;

        // Assign the average score to the student
        $student['finalGrade'] = $averageScore;
    }
}

// Sample data: List of students and their test scores
$students = [
    [
        'name' => 'Alice',
        'tests' => [90, 85, 88],
    ],
    [
        'name' => 'Bob',
        'tests' => [78, 92, 80],
    ],
    [
        'name' => 'Charlie',
        'tests' => [95, 89, 91],
    ],
    // ... (many more students and test scores)
];

// Calculate final grades for students without copying data
calculateFinalGrades($students);

// Display the updated list of students with final grades
foreach ($students as $student) {
    echo "{$student['name']}'s Final Grade: {$student['finalGrade']}<br>";
}

এই বাস্তব উদাহরণে:

  • আমরা একটি ফাংশন calculateFinalGrades সংজ্ঞায়িত করি যা reference variable ($students) হিসাবে students দের একটি array নেয় এবং তাদের final grades হিসেব করে।
  • ফাংশনের ভিতরে, আমরা students দের লিস্ট এবং তাদের পরীক্ষার স্কোরগুলির মাধ্যমে iterate করি। আমরা প্রতিটি student এর জন্য total score হিসাব করি এবং তারপর average score হিসাব করি।
  • আমরা student এর অ্যারের মধ্যে finalGrade key -তে হিসাব করা average score এসাইন করে student এর ডেটা সরাসরি আপডেট করতে references ব্যবহার করি।
  • আমাদের কাছে sample data রয়েছে যা students দের একটি লিস্ট এবং তাদের test scores গুলি $students অ্যারেতে সংরক্ষিত আছে।
  • আমরা calculateFinalGrades ফাংশনকে কল করি , যা প্রতিটি student এর জন্য data copy না করে final grades হিসাব করে।
  • সবশেষে, আমরা students দের final grade সহ তাদের আপডেট করা লিস্ট প্রদর্শন করি।

এই উদাহরণে রেফারেন্স ব্যবহার করে আপনি student এর ডেটার অতিরিক্ত কপি তৈরি করার প্রয়োজন ছাড়াই data structure এর মাধ্যমে iterating করার সময় দক্ষতার সাথে প্রতিটি student এর জন্য final grades হিসাব করতে পারবেন। large datasets নিয়ে কাজ করার সময় এটি বিশেষভাবে উপকারী হতে পারে।

৮. Custom Data Structures:

আপনি যদি custom data structures বা data manipulation algorithm গুলো প্রয়োগ করেন, তাহলে reference গুলি ডেটা ম্যানেজিং আরও নিয়ন্ত্রণ এবং efficiency প্রদান করতে পারে।

আসুন একটি কাস্টম ডেটা কাঠামোর একটি real-life উদাহরণ দেখি ৷ “Book Catalog” নামে একটি custom data structure ব্যবহার করে একটি library catalog system এর একটি simplified representation বিবেচনা করুন।

Custom Data Structure: Book Catalog

একটি Book Catalog, একটি লাইব্রেরিতে books সম্পর্কে তথ্য organize এবং manage করার জন্য ডিজাইন করা একটি data structure. এটি book titles, authors, ISBN numbers এবং availability status এর মতো ডেটা সংরক্ষণ করতে পারে।

Example: আমরা একটি Book Catalog কে রিপ্রেজেন্ট করে এমন একটি PHP class তৈরি করব এবং প্রদর্শন করব কিভাবে এটি বইয়ের তথ্য পরিচালনা করতে ব্যবহার করা যেতে পারে।

<?php
class Book {
    public $title;
    public $author;
    public $isbn;
    public $isAvailable;

    public function __construct($title, $author, $isbn) {
        $this->title = $title;
        $this->author = $author;
        $this->isbn = $isbn;
        $this->isAvailable = true; // Assume all books are available initially
    }
}

class BookCatalog {
    private $books = [];

    // Add a book to the catalog
    public function addBook(&$book) {
        $this->books[] = $book;
    }

    // Check out a book by ISBN
    public function checkOutBook($isbn) {
        foreach ($this->books as &$book) {
            if ($book->isbn === $isbn && $book->isAvailable) {
                $book->isAvailable = false;
                return $book;
            }
        }
        return null; // Book not found or unavailable
    }

    // List all available books
    public function listAvailableBooks() {
        $availableBooks = [];
        foreach ($this->books as $book) {
            if ($book->isAvailable) {
                $availableBooks[] = $book;
            }
        }
        return $availableBooks;
    }
}

// Create a Book Catalog
$catalog = new BookCatalog();

// Add books to the catalog
$book1 = new Book("The Great Gatsby", "F. Scott Fitzgerald", "978-0743273565");
$book2 = new Book("To Kill a Mockingbird", "Harper Lee", "978-0061120084");
$book3 = new Book("1984", "George Orwell", "978-0451524935");
$catalog->addBook($book1);
$catalog->addBook($book2);
$catalog->addBook($book3);

// Check out a book
$checkedOutBook = $catalog->checkOutBook("978-0743273565");
if ($checkedOutBook !== null) {
    echo "Checked out: " . $checkedOutBook->title . "\n";
}

// List available books
$availableBooks = $catalog->listAvailableBooks();
echo "Available Books:\n";
foreach ($availableBooks as $book) {
    echo "- " . $book->title . " by " . $book->author . "\n";
}

এই বাস্তব উদাহরণে:

  • Book class টি individual books এবং তাদের attributes উপস্থাপন করে।
  • BookCatalog class বইয়ের কালেকশন ম্যানেজ করার জন্য একটি custom data structure হিসাবে কাজ করে।
  • আমরা দক্ষতার সাথে ক্যাটালগে book গুলো যোগ করতে reference variables ব্যবহার করি।
  • checkOutBook method ব্যবহারকারীদের ISBN দ্বারা available বইগুলি চেক করার অনুমতি দেয়।
  • listAvailableBooks method ক্যাটালগে সমস্ত available book গুলো লিস্ট করে।

এই উদাহরণটি ব্যাখ্যা করে যে কীভাবে একটি custom data structure, যেমন একটি Book Catalog, library catalog সিস্টেমে Book গুলিকে অর্গানাইজ এবং ট্র্যাক করার মতো দক্ষতার সাথে real-world ডেটা ম্যানেজ করতে ব্যবহার করা যেতে পারে।

আমি মাসুদ আলম, বাংলাদেশের ৩৬ তম Zend Certified Engineer । ২০০৯ সালে কম্পিউটার সাইন্স থেকে বেচেলর ডিগ্রী অর্জন করি। দীর্ঘ ১৫ বছর আমি Winux Soft, SSL Wireless, IBCS-PRIMAX, Max Group, Canadian International Development Agency (CIDA), Care Bangladesh, World Vision, Hellen Keller, Amarbebsha Ltd সহ বিভিন্ন দেশি বিদেশী কোম্পানিতে ডেটা সাইন্স, মেশিন লার্নিং, বিগ ডেটা, ওয়েব ডেভেলপমেন্ট এবং সফটওয়্যার ডেভেলপমেন্ট এর উপর বিভিন্ন লিডিং পজিশন এ চাকরি এবং প্রজেক্ট লিড করি। এছাড়াও বাংলাদেশের ১৮৫ জন জেন্ড সার্টিফাইড ইঞ্জিনিয়ার এর মধ্যে ১২০ এরও অধিক ছাত্র আমার হাতে জেন্ড সার্টিফাইড ইঞ্জিনিয়ার হয়েছেন। বর্তমানে w3programmers ট্রেনিং ইনস্টিটিউট এ PHP এর উপর Professional এবং Advance Zend Certified PHP -8.2 Engineering, Laravel Mastering Course with ReactJS, Python Beginning To Advance with Blockchain, Machine Learning and Data Science, Professional WordPress Plugin Development Beginning to Advance কোর্স করাই। আর অবসর সময়ে w3programmers.com এ ওয়েব টেকনোলজি নিয়ে লেখালেখি করি।

Leave a Reply