ফাংশনস

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

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

পিএইচপি তে বাই ডিফল্ট যেসব ফাংশন আগেই তৈরি করা থাকে সেগুলোকেই আমরা বিল্ট ইন ফাংশন বলি । এগুলো আমাদের জন্য আগেই তৈরি করা তাকে, আমাদের কাজ শুধু কল করা ।

<?php
var_dump("This is .....");
?>

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

আমাদের নানা কাজে নানা ধরণের ফাংশন প্রয়োজন হয়, এই সব ক্ষেত্রে আমরা নিজেরাই ফাংশন তৈরি করে নিতে পারি বা অন্যের তৈরি করা ফাংশন ব্যবহার করতে পারি । যে সব ফাংশন ইউজার অর্থাৎ আমাদের (আমার নিজের বা অন্য কোন ডেভেলপারের) তৈরি করা সেগুলোকে ইউজার ডিফাইনড ফাংশন বলা হয় ।

<?php
function sayHello($name)
{
    return "Hello {$name}!";
}
?>

এখানে আমরা একটি ইউজার ডিফাইনড ফাংশন দেখছি, এই ফাংশনটি একটি নাম এ্যাক্সেপ্ট করে একটি সুন্দর গ্রিটিং রিটার্ন করে ।

ডিফাইনিং ফাংশন

যেকোন ইউজার ডিফাইনড ফাংশন লিখতে হলে আপনাকে নিচের সিনট্যাক্স অনুসরণ করতে হবে:

<?php
function functionName($arg1,$arg2)
{
    // কোড ব্লক 
}
?>

প্রথমে ফাংশন কিওয়ার্ড, তারপর ফাংশনের নাম, এরপর ব্রাকেটে প্যারামিটার লিস্ট, এরপর ফাংশনের মূল বডি যেটি কিনা একটি কোড ব্লক ।

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

প্যারামিটার ও আর্গুমেন্ট

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

আর ফাংশন কল করার সময় ঐ প্যারামিটারগুলোর জন্য ভ্যালু পাস করার জন্য যে এক্সপ্রেশন ব্যবহার করি সেটাই হলো আর্গুমেন্ট ।

সহজ ভাষায়, ফাংশন ডিফাইন করার সময় ব্যবহৃত ভ্যারিয়েবলগুলো প্যারামিটার, কল করার সময় ফাংশন টাকে যেই ভ্যালু পাস করে কল করি তা হলো আর্গুমেন্ট ।

উদাহরণ:

<?php
function testFunc($name, $age) 
{

}

testFunc("masnun", 5*4)

এখানে $name এবং $age হলো প্যারামিটার, "masnun" এবং 5*4 হলো আর্গুমেন্ট । তবে প্রায়শই আমরা দেখি এই দুটো টার্ম এর একটার জায়গায় আরেকটা টার্ম ব্যবহৃত হতে ।

প্যারামিটার ছাড়া ফাংশন

<?php
function functionName()
{
   echo "Hi i don't have any argument!";
}
?>

এই ফাংশনটিতে কোন প্যারামিটার নেই। অর্থাৎ একে কল করার সময় কোন আর্গুমেন্ট পাস করাতে হবে না। অনেকটা এই রকম করে functionName(); । প্যারামিটার না নিলে প্যারামিটার লিস্ট এর ব্রাকেট টা আমরা এভাবে ফাকাই রাখবো ।

প্যারামিটার সহ ফাংশন

<?php
function functionName($arg1,$arg2)
{
   echo $arg1;
   echo $arg2;
}
?>

প্যারামিটার গুলো ব্রাকেটের মধ্যে কমা দিয়ে আলাদা করা হয় । এই ফাংশনটিতে দুইটি প্যারামিটার আছে $arg1 এবং $arg2 , এই ফাংশনটিকে কল করতে হলে ফাংশনের মধ্যে এই দুইটি প্যারামিটার এর জন্য আর্গুমেন্ট পাস করাতে হবে। অনেকটা এই রকম করে functionName('This is arg 1','This is 2');, যদি ফাংশনটি কল করার সময় আর্গুমেন্টগুলো না থাকে তবে আর্গুমেন্ট মিসিং এরর দেখাবে। তাই এগুলো রিকোয়ারড আর্গুমেন্ট ।

পিএইচপি ফাংশনে একটি প্যারামিটারের ডিফল্ট ভ্যালু ডিফাইন করে দেওয়া যায় । যেমন:

<?php
function functionName($arg1="default value")
{
   echo $arg1;
}
?>

এই ফাংশনটি কল করার সময় কোন আর্গুমেন্টের ভ্যালু না দিলেও চলবে (functionName();) । সেক্ষেত্রে $arg1 এর ভ্যালু হবে তার ডিফল্ট ভ্যালু । এভাবেই আমরা যে কোন প্যারামিটারের ডিফল্ট ভ্যালু ডিফাইন করে দিয়ে সেই প্যারামিটারটিকে অপশনাল প্যারামিটারে পরিনত করতে পারি ।

রিটার্ন ভ্যালু

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

return কিওয়ার্ডটি ব্যবহার করে ভ্যালু রিটার্ন করা হয়।

<?php
function functionName($arg1,$arg2)
{
   return $arg1.$arg2;
}
?>

ভ্যারিয়েবল ফাংশন

আমরা চাইলে একটি ফাংশনকে ভ্যারিয়েবল ব্যবহার করে কল করতে পারি । এক্ষেত্রে আমরা ফাংশনটির নাম একটি ভ্যারিয়েবল এ এ্যাসাইন করি । এরপর ঐ ভ্যারিয়েবলটির পর () ব্যবহার করে ফাংশনটি কল করি । উদাহরণ দেখি:

<?php
function foo() {
    echo "In foo()<br />\n";
}

function bar($arg = '')
{
    echo "In bar(); argument was '$arg'.<br />\n";
}

// This is a wrapper function around echo
function echoit($string)
{
    echo $string;
}

$func = 'foo';
$func();        // This calls foo()

$func = 'bar';
$func('test');  // This calls bar()

$func = 'echoit';
$func('test');  // This calls echoit()
?>

[উদাহরনটি পিএইচপি ম্যানুয়াল থেকে নেওয়া]

ফাংশনে ভ্যারিয়েবলের ব্যবহার

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

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

<?php
$myvar = 100; // $myvar একটি গ্লোবাল ভ্যারিয়েবল

function myFunc()
{
    $myvar = 50; // $myvar একটি লোকাল ভ্যারিয়েবল
}
?>

চাইলে গ্লোবাল ভ্যারিয়েবলগুলোকে সরাসির ফাংশন / মেথডের ভেতরে ব্যবহার করা যায়। এর জন্য global স্টেটমেন্ট ব্যবহার করতে হবে। নিচের উদাহরনটি দেখুনঃ

<?php
$myvar = 100; // $myvar একটি গ্লোবাল ভ্যারিয়েবল

function myFunc()
{
    global $myvar;
    echo $myvar // $myvar একটি গ্লোবাল ভ্যারিয়েবল
}
?>

এখানে আমরা ফাংশনের ভিতর থেকেও গ্লোবাল $myvar ভ্যারিয়েবলটি এ্যাক্সেস করেছি ।

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

মনে করা যাক আমাদের একটি ফাংশন আছে যার নাম query() এখন আমাদের পুরো প্রোগ্রামে সকল ডাটাবেস কুয়েরির জন্য আমরা এই ফাংশনটি ব্যবহার করব। এই কারনে আমারা ফাংশনের মধ্যে একটি static ভ্যারিয়েবল ব্যবহার করব। যা কতবার এই ফাংশনটিকে কল করা হয়ে তার হিসাব রাখবে।

<?php
function query()
{
    static $count;
    $count += 1;
    $queryResult = "This is Query Result";
    return array('query' => $queryResult, 'count' => $count);
}
// চারবার কল করা হয়েছে।
var_dump(query());
var_dump(query());
var_dump(query());
var_dump(query());
?>

আউটপুটঃ

array (size=2)
  'query' => string 'This is Query Result' (length=20)
  'count' => int 1
array (size=2)
  'query' => string 'This is Query Result' (length=20)
  'count' => int 2
array (size=2)
  'query' => string 'This is Query Result' (length=20)
  'count' => int 3
array (size=2)
  'query' => string 'This is Query Result' (length=20)
  'count' => int 4

এনোনিমাস ফাংশন

এই জাতীয় ফাংশনগুলোর কোন স্পেসিফিক নাম থাকে না। উদাহরন হিসাবে নিচের কোডটি দেখুন।

<?php
$data = function (){
    $val = array();
    for($i=0;$i<10;$i++)
    {
        $val[] = $i;
    }
    return $val;
};

var_dump($data());
?>

এখানে আমরা ফাংশনটির কোন নাম দেইনি কিন্তু বাকি অংশগুলো ঠিক রেখেছি । এই ফাংশনটির কোন নাম না থাকলেও আমরা $data ভ্যারিয়েবলটি ব্যবহার করে ফাংশনটি কল করতে পারি ।

এনোনিমাস ফাংশনে স্বাভাবিক ফাংশনের মত করেই আর্গুমেন্ট ব্যবহার করা যায়, নিচের কোড দেখুনঃ

<?php
$data = function ($limit){
    $val = array();
    for($i=0;$i<$limit;$i++)
    {
        $val[] = $i;
    }
    return $val;
};

var_dump($data(20));
?>

রিকার্সিভ ফাংশন

কোন ফাংশন যখন নিজে নিজেকে কল করে তখন তাকে রিকার্সিভ ফাংশন বলা হয়ে থাকে। নিচে ফ্যাক্টোরিয়াল এর উদাহরন দেওয়া হলো । এখানে $n এর ভ্যালু কমিয়ে কমিয়ে ফাংশনটি রিকার্সিভলি কল করা হয় । যখন $n এর ভ্যালু শূন্য হয় তখনই সে থেমে যায় । যে শর্তের উপর নির্ভর করে ফাংশনটি নিজেকে আবার কল করে বা থেমে যায় এটাকে বেইজ কন্ডিশন বা বেইজ কেইস বলা হয় । রিকার্সিভ ফাংশনে বেইজ কেইস সেট করে দেওয়া জরুরী নাহলে এই রিকার্শন থিওরেটিক্যালি থামবে না । প্র্যাক্টিকালি পিএইচপি একটি নির্দিষ্ট লেভেল এর রিকার্শন এর পর ইরর থ্রো করবে ।

যদি রিকার্সিভ ফাংশন থেকে ডাটা রিটার্ন করতে হয় তবে মূল ফাংশনের ভেতরে নিজেকে আবার কল করার সময় ফাংশনের সামনে return লাগিয়ে কল করতে হবে।

<?php
function fact($n) {
  if ($n === 0) { // our base case
     return 1;
  }
  else {
     return $n * fact($n-1); // <--calling itself.
  }
}

var_dump(fact(10));
?>

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

সাধারণত ফাংশন নেস্টিং ৯৯ বার পর্যন্ত লিমিট করা থাকে। তাই Fibonacci জাতীয় প্রোগ্রাম for / while / if দিয়ে করা উচিত।