পরিচিতি
PHP-তে একটি ফাংশন ডিফাইন করা যায় যাতে কলিং এনভায়রনমেন্ট/স্ক্রিপ্ট থেকে আর্গুমেন্ট হিসেবে ইনপুট গ্রহণ করতে পারে। আর্গুমেন্টগুলো ফাংশন নামের সামনে প্যarethেনসিসের ভেতরে কমা-সেপারেটেড লিস্ট হিসেবে দেওয়া হয়। নোট করুন, ফাংশন কল করার সময় একই সংখ্যক আর্গুমেন্ট পাস করতে হয়।
PHP ফাংশন কল সাপোর্ট করে: ভ্যালু দিয়ে পাস, রেফারেন্স দিয়ে পাস, ডিফল্ট ভ্যালুসহ আর্গুমেন্ট এবং ভেরিয়েবল সংখ্যক আর্গুমেন্ট পাস।
আর্গুমেন্টসহ ফাংশন
নিচের উদাহরণে, একটি ফাংশন দুটি ফরমাল আর্গুমেন্টসহ ডিফাইন করা হয়েছে। এই ফাংশন কল করা হয়েছে আর্গুমেন্ট ভ্যালু দিয়ে পাস করলে। ফাংশনের আর্গুমেন্টগুলো এর লোকাল ভেরিয়েবল হয়ে যায়। তাই ফাংশন ভেতরে আর্গুমেন্টের মান পরিবর্তন করলে সেটি বাইরে রিফলেক্ট হয় না।
এখানে, $x-র মান ফাংশন ভেতরে পরিবর্তন করা হয়েছে, কিন্তু কলের পর এর মান চেক করলে আগের মানই থাকে—
উদাহরণ
<?php
function add($x, $y){
$x= $x+$y ;
echo $x . "\n";
}
$x=10;
$y=20;
add($x,$y);
// ফাংশন বাইরে $x এর আগের মানই আছে
echo $x;
?>
আউটপুট
এটি নিচের ফলাফল দেবে—
30 10
ফাংশনে অ্যারে পাস করা
নিচের উদাহরণে, add() ফাংশন অ্যারে আর্গুমেন্ট হিসেবে গ্রহণ করার জন্য ডিফাইন করা হয়েছে। ফাংশন ভেতরে foreach লুপ দিয়ে অ্যারে এলিমেন্টগুলো ট্রাভার্স করা হয়েছে—
উদাহরণ
<?php
function add($arr){
$sum=0;
foreach ($arr as $i){
$sum+=$i;
}
echo "sum = " .$sum;
}
add(array(1,2,3));
?>
আউটপুট
এটি নিচের ফলাফল দেবে—
sum = 6
রেফারেন্স দিয়ে আর্গুমেন্ট পাস (Passing arguments by reference)
ভ্যালু ডিফল্টভাবে ফাংশনের আর্গুমেন্টে ভ্যালু দিয়ে পাস করা হয়। তাই ফাংশন ভেতরে আর্গুমেন্টের মান পরিবর্তন করলে সেটি বাইরে রিফলেক্ট হয় না। আর্গুমেন্ট রেফারেন্স দিয়ে পাস করলে পরিবর্তন আর্গুমেন্টের আসল ভ্যালুতে বাইরে রিফলেক্ট হয়।
রেফারেন্স দিয়ে রিসিভ করতে আর্গুমেন্টের নাম & সিম্বল দিয়ে প্রিফিক্স করতে হয়।
উদাহরণ
<?php
function swap(&$x, &$y){
$t=$x;
$x=$y;
$y=$t;
echo "inside function x=$x y=$y\n";
}
$x=5;
$y=7;
echo "before calling function x=$x y=$y\n";
swap($x, $y);
echo "after calling function x=$x y=$y\n";
?>
আউটপুট
এটি নিচের ফলাফল দেবে—
before calling function x=5 y=7 inside function x=7 y=5 after calling function x=7 y=5
swap() ফাংশনে $x এবং $y এর মান ইন্টারচেঞ্জ করা হয়েছে। যেহেতু ভেরিয়েবলগুলো রেফারেন্স দিয়ে পাস করা হয়েছে, ফাংশন বাইরেও ভেরিয়েবলগুলো মডিফাইড ভ্যালু দেখাবে।
টাইপ হিন্টস (Type Declarations)
PHP আসলে একটি ডাইনামিক্যালি টাইপড ল্যাঙ্গুয়েজ। তাই ভেরিয়েবল ডিক্লেয়ার করার সময় এর টাইপ ডিক্লেয়ার করা প্রয়োজন নয় (C/C++ বা Java-র মতো)। তবে, ফাংশনের আর্গুমেন্টে টাইপ ডিক্লেয়ারেশন পার্সারকে ইনকরেক্ট ডেটা টাইপ ডিটেক্ট করতে সাহায্য করে।
সিনট্যাক্স
// টাইপ হিন্টসহ ফাংশন ডেফিনিশন
function myfunction(type $arg1, type $arg2){
..
..
}
সব স্ট্যান্ডার্ড PHP ডেটা টাইপ (স্কেলার টাইপ, অ্যারে, ক্লাস/ইন্টারফেস, iterable এবং object) ফাংশন ডিক্লেয়ারেশনে টাইপ হিন্ট হিসেবে দিতে পারে।
উদাহরণ
<?php
function add(...$numbers){
$ttl=0;
foreach ($numbers as $num){
$ttl=$ttl+$num;
}
return $ttl;
}
$total=add(10,15,20);
echo "total= $total\n";
echo "total=". add(1,2,3,4,5). "\n";
?>
আউটপুট
এটি নিচের ফলাফল দেবে—
total= 45 total=15
func_get_args() ফাংশন দিয়ে ফাংশনে পাস করা আর্গুমেন্টের লিস্ট পাওয়া যায়। PHP লুপ চালিয়ে পাস করা আর্গুমেন্টের প্রতিটি মান ট্রাভার্স করা যায়। সেক্ষেত্রে ফাংশন ডেফিনিশনে ফরমাল আর্গুমেন্ট থাকে না।
উদাহরণ
<?php
function add (int $x, int $y){
$z=$x+$y;
echo "addition=$z\n";
}
add(10,20);
add(5.55, 6.66);
?>
আউটপুট
এটি নিচের ফলাফল দেবে—
addition=30 addition=11
দ্বিতীয় কলেও add() ফাংশনে ফ্লোট দেওয়া হয়েছে, কিন্তু কোনো এরর/ওয়ার্নিং নেই। কারণ PHP ইন্টারন্যালি ফ্লোটকে ইন্টিজারে কোয়ার্স করে যোগ করে। এই অটোমেটিক টাইপ কনভার্সন রোধ করতে declare কনস্ট্রাক্ট strict_types=1 দিয়ে ব্যবহার করুন।
উদাহরণ
<?php
declare(strict_types=1);
function add (int $x, int $y){
$z=$x+$y;
echo "addition=$z\n";
}
add(10,20);
add(5.55, 6.66);
?>
দ্বিতীয় কল এখন এক্সসেপশন থ্রো করবে—
আউটপুট
addition=30 PHP Fatal error: Uncaught TypeError: Argument 1 passed to add() must be of the type integer, float given