পিএইচপি কলব্যাক ফাংশন পরিচিতি

“সে” কলব্যাক না করলে আপনি হয়ত “অ” হয়ে যান! মানে বলতে চাচ্ছিলাম যে অভিমানী নয়তো অস্থির হয়ে যান 😉 । আর যদি আপনার লাইফে “সে”  না থাকে তবে তো কথাই নেই। আমার মত বিন্দাস 😀 । যাইহোক, আপনি “অ” হোন আর নাই হোন, “সে” কলব্যাক করুক আর নাই করুক আজকে আমরা কলব্যাক নিয়েই আলোচনা করব। চলুন তাহলে শুরু থেকেই শুরু করি…

কলব্যাক ফাংশন হচ্ছে যে ফাংশনকে অন্য ফাংশনের প্যারামিটার হিসেবে নিয়ে সেই অন্য ফাংশনের ভিতর কল বা এক্সিকিউট করা যায়। কলব্যাক ফাংশনের আরেকটি নাম হল Higher Order Function। বাংলায় এটাকে ঊচ্চমার্গীয় ফাংশন হিসেবে ভেবে নিতে পারেন। ঊচ্চমার্গীয় কথাবার্তা মাথার উপর দিয়ে গেলেও ঊচ্চমার্গীয় ফাংশন মাথার নীচ দিয়েই যাবে, নিশ্চিত থাকুন 🙂

পিএইচপির বিল্টইন বহু ফাংশন কলব্যাক ফাংশন আর্গুমেন্ট হিসেবে একসেপ্ট করে। এ্যারের ফাংশন সেটে এরকম বেশকিছু ফাংশন আছে। যেমনঃ array_map(), array_filter(), array_walk(), array_reduce()। চলুন, এ্যারের কিছু ফাংশনের মাধ্যমে কলব্যাকের ব্যবহার এবং বিস্তারিত জেনে নেই।

$nums = [1,2,3,4,5,6,7];
$output = array_reduce($nums, function($carry, $item) {
    return $carry += $item;
});
var_dump($output); // int(28)

উপরের উদাহরণে আমরা কলব্যাক হিসেবে এ্যাননিমাস বা নামহীন ফাংশন ব্যবহার করেছি। এ্যাননিমাস ফাংশন ছাড়াও আমরা অবজেক্টের মেথড,  ক্লাসের স্ট্যাটিক মেথড, ইউজার ডিফাইন্ড ফাংশন অথবা বিল্টইন ফাংশনও ব্যবহার করতে পারি। শুধু মাত্র ল্যাঙ্গুয়েজ কন্সট্রাক্ট ছাড়া, যেমনঃ array(), echo, empty(), eval(), exit(), isset(), list(), print অথবা unset()

ইউজার ডিফাইন্ড ফাংশনঃ

$nums = [1,2,3,4,5,6];
function sum($carry, $item)
{
    return $carry += $item;
}
$result = array_reduce($nums, 'sum');
var_dump($result); // int(21)

বিল্টইন ফাংশনঃ

$fruits = ['apple', 'banana', 'mango', 'jackfruit', 'pineapple'];
$fruitsLen = array_map('strlen', $fruits);
var_dump($fruitsLen);
// array(5) {
//   [0]=>
//   int(5)
//   [1]=>
//   int(6)
//   [2]=>
//   int(5)
//   [3]=>
//   int(9)
//   [4]=>
//   int(9)
// }

অবজেক্ট মেথড ও ক্লাসের স্ট্যাটিক মেথডঃ

class Calculator
{
    public function sum($carry, $item)
    {
        return $carry += $item;
    }
    public static function staticSum($carry, $item)
    {
        return $carry += $item;
    }
}
$calc = new Calculator;
$nums = [1,2,3,4,5];

// Object method call
$result = array_reduce($nums, [$calc, 'sum']);
var_dump($result); // int(15)

// Static method call
$result = array_reduce($nums, ['Calculator', 'staticSum']);
var_dump($result); // int(15)

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

কাস্টম এ্যারে ম্যাপিং ফাংশনঃ

এবার দেখে নেয়া যাক আমরা কিভাবে আমাদের বানানো ফাংশনে প্যারামিটার হিসেবে কলব্যাক ব্যবহার করতে পারি। আমরা একটি এ্যারে ম্যাপিং ফাংশন বানাবো। পিএইচপির বিল্টইন এ্যারে ম্যাপিং ফাংশন একাধিক এ্যারে নিয়ে কাজ করে। কিন্তু আমরা একটি এ্যারে নিয়েই কাজ করব। “সে” নেই তাই সব সিঙ্গেল সিঙ্গেল হবে 😉

function array_map_single(array $array, callable $callback)
{
    $result = [];
    foreach($array as $key => $val)
    {
        /**
         * There are two ways to execute $callback
         * using call_user_func* or simply $callback()
         * I am not sure which one is best practice,
         * So I'd love to know if you are aware 🙂
         */
        array_push($result, $callback($val, $key));
        // array_push($result, call_user_func($callback, $val, $key));
    }
    return $result;
}

$result = array_map_single(range(1, 5), function($val) {
    return $val += 2;
});
var_dump($result);
// array(5) {
//   [0]=>
//   int(3)
//   [1]=>
//   int(4)
//   [2]=>
//   int(5)
//   [3]=>
//   int(6)
//   [4]=>
//   int(7)
// }

ওয়ার্ডপ্রেসে কলব্যাকঃ

বহুল ব্যবহৃত এ্যাকশন হুক, ফিল্টার হুক থেকে শুরু করে মেটাবক্স, হেল্পমেনু এপিআই সহ প্রায় সব এপিআই ফাংশন কলব্যাক নিয়ে কাজ করে। তাই ওয়ার্ডপ্রেস নিয়ে যারা কাজ করি বা শুরু করছি তাদের কলব্যাক নিয়ে স্পষ্ট ধারনা থাকা দরকার। চলুন, মেটাবক্স রেজিস্টারের মাধ্যমে ওয়ার্ডপ্রেসে কলব্যাকের ব্যবহার দেখে নেই-

function op_register_menu_meta_box() {
    add_meta_box(
        'op-menu-meta-box-id',
        esc_html__( 'Op Menu MetaBox Title', 'text-domain' ),
        'op_render_menu_meta_box',
        'nav-menus',
        'side',
        'core'
        );
}
add_action( 'load-nav-menus.php', 'op_register_menu_meta_box' );

function op_render_menu_meta_box() {
    echo 'metabox output';
}

উদাহরণে op_render_menu_meta_box এবং op_register_menu_meta_box দুটোই কলব্যাক ফাংশন।

৫০০+ ওয়ার্ড পড়ার পর নিশ্চয়ই ঊচ্চমার্গীয় ফাংশনকে আর ঊচ্চমার্গীয় মনে হচ্ছে না, তাই না? বলেই ছিলাম শুরুতে মাথার নীচ দিয়েই যাবে 😀 যদি এরপরও মাথার উপর দিয়ে যায় তাহলে কমেন্ট বক্সে কমেন্ট করে উড়াই দিবেন, আমি ধরে নিবো 🙂

ধন্যবাদ