PHP Anonymous, lambda, Closures and Arrow Functions

PHP Anonymous functions কি?

PHP Anonymous function

PHP Anonymous functions: Anonymous শব্দের অর্থ হচ্ছে নাম বিহীন বা বেনামী, আর anonymous function মানে হচ্ছে নাম বিহীন function বা বেনামী function, সুতরাং PHP তে যখন কোনো function declare বা ঘোষণা করা হয়, কিন্তু function টির কোনো নাম থাকেনা, PHP তে সেই function কে anonymous function বলে।

Anonymous function বুঝার জন্য প্রথমে আমরা একটা সাধারণ function তৈরী করি।

<?php
function makeGreeting($name, $timeOfDay){
  return $timeOfDay." ". $name."!";
}
 
echo makeGreeting("Omran","Good Morning");
//Result: Good Morning Omran!
?>

উপরের function টিকেই anonymous function হিসেবে নিচের মতো declare এবং call করতে পারি।

Zend Certified PHP Engineering (ZCPE) Course

নোট : anonymous function অবশ্যই semi-colon (;) দিয়ে শেষ করতে হয়।
<?php
// Assign an anonymous function to a variable
$makeGreeting = function( $name, $timeOfDay ) {
  return "Good $timeOfDay, $name!";
};
echo $makeGreeting("Omran","Morning"); 
//Result: Good Morning Omran!
?>

ব্যাখ্যা : পাঠক ভালোভাবে লক্ষ্য করুন, আমরা সাধারণত function keyword লেখার পর function name “অর্থাৎ : function test(){….} “লিখি। কিন্তু উপরের কোডে আমরা তা করি নাই, বরং আমরা নাম ছাড়া function declare করি, এবং variable এ সংরক্ষণ করি। এবং পরবর্তীতে সেই variable এর সাথে parenthesis যোগ করে function হিসেবে কল করি.

PHP তে Lambda function কি?

যখন একটি anonymous function অন্য একটা function এর argument হিসেবে pass হয়, তখন সেটিকে বলা হয় lambda function. চলুন একটি উদাহরণ দেখা যাক:

<?php
// Pass Lambda to function
function shout ($message){
  echo $message();
}
 
// Call function
shout(function(){
  return "Hello world";
});
?>

ব্যাখ্যা : পাঠক ভালোভাবে লক্ষ্য করুন, shout function এর $message parameter টি argument হিসেবে একটি anonymous function receive করেছে।

PHP তে কি anonymous function কে array element হিসেবে ব্যবহার করা যাবে ?

Zend Certified PHP Engineering (ZCPE) Course

অবশ্যই PHP তে anonymous function কে array element হিসেবে ব্যবহার করা যাবে। চলুন একটি উদাহরণ দেখা যাক:

<?php
// Store 3 anonymous functions in an array
$luckyDip = array(

function() {
echo 'You got a bag of toffees!';
},

function() {
echo 'You got a toy car!';
},

function() {
echo 'You got some balloons!';
}
);
// Call a random function
$choice = rand( 0, 2 );
$luckyDip[$choice]();
?>

Random Result:

You got a toy car!

ব্যাখ্যা : এখানে $choice variable টি rand function দিয়ে 0-2 range এর মধ্যে random number generate করবে। আর আমাদের array টির index ও 0-2 এর মধ্যে, তাই এখানে তিনটি anonymous function থেকে randomly যেকোনো একটির result আসবে।

PHP তে anonymous function কি callback function হিসেবে ব্যবহার করা যাবে?

হ্যা PHP তে anonymous function কে call back function হিসেবে ব্যবহার করা যাবে। চলুন একটা উদাহরণ দেখা যাক।

<?php
$arr = range(1, 10);
foreach(array_filter($arr, function($val) { return $val % 2 == 0; }) as $val){
    echo $val,"n";
}
//Result: 2,4,6,8,10
?>

ব্যাখ্যা : এখানে array_filter function এর কাজ হচ্ছে কোনো array কে অন্য যেকোনো function দিয়ে array value গুলোকে filter করা। আর উপরের উদাহরণে , আমরা অন্য যেকোনো সাধারণ function এর পরিবর্তে anonymous function ব্যবহার করেছি।

এবার চলুন আমরা anonymous function ব্যবহার করে একটি number sorting করে ফেলি।

<?php
$people = array(
  array( 'name' => 'Omran', 'age' => 39 ),
  array( 'name' => 'ShiShir', 'age' => 23 ),
  array( 'name' => 'Badol', 'age' => 46 )
);

usort( $people, function( $personA, $personB ) {
return ( $personA['age'] < $personB['age'] ) ? -1 : 1;
} );

foreach($people as $val){
    echo "$val[name] is $val[age] years oldn";
}
?>

Result

ShiShir is 23 years old
Omran is 39 years old
Badol is 46 years old

Zend Certified PHP Engineering (ZCPE) Course

PHP তে closures কি ?

closure হচ্ছে একটা object যা anonymous function কে represent করে । অন্য ভাবে বলা যায়, closure হচ্ছে anonymous function কে Object Oriented way তে ব্যবহার করার মাধ্যম। PHP তে closure দিয়ে Anonymous function এর বাহিরের কোনো variable কে anonymous function এর মধ্যে ব্যবহার করা যায় । চলুন একটা উদাহরণ থেকে বুঝা যাক।

উদাহরণ ১: closure ছাড়া anonymous function :

<?php
$client="Farhan";
$output=function(){
        echo "Welcome ".$client;
};

$output(); // will show error
?>

উদাহরণ ২: closure দিয়ে anonymous function :

<?php
$client="Farhan";
$output=function() use($client){
        echo "Welcome ".$client;
};

$output();
//output: Welcome Farhan
?>

closure দিয়ে আরো একটা anonymous function দেখুন :

<?php
function myClosure( $num ) {
return function( $x ) use( $num ){
return $num * $x;
};
}

$closure = myClosure( 10 );
echo $closure( 2 ).'n';// Result: 20
echo $closure( 3 ).'n';// Result: 30
?>

PHP তে Arrow function কি?

Arrow functions, যা “short closures” নামেও পরিচিত, PHP 7.4-এ anonymous function গুলোকে আরো Simple এবং সংক্ষিপ্ত ভাবে তৈরির জন্য চালু করা হয়েছিল। Arrow function গুলি এমন পরিস্থিতির জন্য ডিজাইন করা হয়েছে যেখানে আপনাকে ন্যূনতম সিনট্যাক্স সহ ছোট এবং এক লাইনের anonymous function তৈরি করতে হবে। traditional anonymous function গুলির তুলনায় তাদের আরও কমপ্যাক্ট এবং predictable syntax দিয়ে গঠন রয়েছে।

নিম্নে একটি arrow function এর basic syntax নিয়ে আলোচনা করা হলো:

<?php

$y = 1;
 
$fn1 = fn($x) => $x + $y;
// equivalent to using $y by value:
$fn2 = function ($x) use ($y) {
    return $x + $y;
};

var_export($fn1(3)); // Result: 4
?>

Arrow functions গুলি স্বয়ংক্রিয়ভাবে আশেপাশের scope থেকে ভেরিয়েবলগুলিকে ক্যাপচার করে, এবং এই বিষয়ে traditional anonymous ফাংশনের মতো কাজ করে:

<?php

$z = 1;
$fn = fn($x) => fn($y) => $x * $y + $z;
// Outputs 51
var_export($fn(5)(10));
?>

একইভাবে anonymous ফাংশনের মতো, arrow ফাংশন সিনট্যাক্স অন্যান্য সব ধরণের ফাঙ্কশনের মতোই, যার মধ্যে parameter এবং return types, default values, বৈচিত্র্য, সেইসাথে বাই-রেফারেন্স পাসিং এবং রিটার্নিং সহ। নীচের সবগুলি arrow ফাংশনের উদাহরণ বৈধ :

<?php

fn(array $x) => $x;
static fn(): int => $x;
fn($x = 42) => $x;
fn(&$x) => $x;
fn&($x) => $x;
fn($x, ...$rest) => $rest;

?>

Static Arrow Function:

<?php

$addOne = static function (int $x): int {
    return $x + 1;
};

echo $addOne(1); // Outputs 2
echo PHP_EOL;
echo $addOne(2); // Outputs 3
echo PHP_EOL;
echo $addOne(3); // Outputs 4
echo PHP_EOL;

Arrow Function with Pass By Reference

$value = 42;

$passByReference = fn (&$x) =>$x++;
   
$passByReference($value);

echo $value; // This will output 43

একইভাবে anonymous ফাংশনে আমরা ঠিক এইভাবে লিখতাম:

$value = 42;

$passByReference = function (&$x) {
    $x++;
};

$passByReference($value);

echo $value; // This will output 43 

আমি মাসুদ আলম, বাংলাদেশের ৩৬ তম 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 এ ওয়েব টেকনোলজি নিয়ে লেখালেখি করি।

One thought on “PHP Anonymous, lambda, Closures and Arrow Functions

  1. $luckyDip = array(

    function() {
    echo ‘You got a bag of toffees!’;
    },

    function() {
    echo ‘You got a toy car!’;
    },

    function() {
    echo ‘You got some balloons!’;
    }
    );

    var_dump($luckyDip[0]());
    Answer: You got a bag of toffees!NULL
    So Sir, My Question is why there is a NULL printing After I specify the index?
    And another question is in $luckyDip[$choice](); why we need to put () at the end? Is it showing that we are calling a function?
    Thank you Sir, I love your lessons and try to follow, your work help me a lot. 🙂

Leave a Reply