ভূমিকা
foreach এর মতো লুপিং কনস্ট্রাক্ট ব্যবহার করে বড় ডেটা কালেকশন ট্রাভার্স করলে বড় মেমরি এবং đáng kể প্রসেসিং টাইম লাগে। জেনারেটর দিয়ে এই ওভারহেড ছাড়াই ডেটার একটি সেটের ওপর ইটারেট করা সম্ভব। একটি জেনারেটর ফাংশন একটি সাধারণ ফাংশনের মতো। কিন্তু, একটি ফাংশনে return স্টেটমেন্টের পরিবর্তে, জেনারেটর yield কিওয়ার্ড ব্যবহার করে বারবার এক্সিকিউট হয় যাতে ইটারেশনের জন্য মান প্রদান করে।
yield কিওয়ার্ড জেনারেটর মেকানিজমের হৃদয়। যদিও এর ব্যবহার return-এর মতো দেখায়, এটি ফাংশনের এক্সিকিউশন বন্ধ করে না। এটি ইটারেশনের জন্য পরবর্তী মান প্রদান করে এবং ফাংশনের এক্সিকিউশন পজ পוז করে।
মান yield করা
একটি for লুপের লুপিং ভেরিয়েবলের প্রতিটি মান একটি জেনারেটর ফাংশনের ভিতরে yield করা হয়।
উদাহরণ
<?php
function squaregenerator(){
for ($i=1; $i<=5; $i++){
yield $i*$i;
}
}
$gen=squaregenerator();
foreach ($gen as $val){
echo $val . " ";
}
?>
foreach স্টেটমেন্ট প্রথমবার $val ডিসপ্লে করার চেষ্টা করলে, squaregenerator প্রথম এলিমেন্ট yield করে, $i রিটেইন করে এবং foreach পরবর্তী ইটারেশন নেওয়া পর্যন্ত এক্সিকিউশন পজ রাখে। আউটপুট একটি সাধারণ foreach লুপের মতো।
আউটপুট
1 4 9 16 25
PHP-এর range() ফাংশন $start থেকে $stop পর্যন্ত $step ইন্টারভালে ইন্টিজারদের একটি তালিকা রিটার্ন করে। নিচের প্রোগ্রাম range() কে জেনারেটর হিসেবে ইমপ্লিমেন্ট করে:
উদাহরণ
<?php
function rangegenerator($start, $stop, $step){
for ($i=$start; $i<=$stop; $i+=$step){
yield $i;
}
}
foreach (rangegenerator(2,10,2) as $val){
echo $val . " ";
}
?>
আউটপুট
আউটপুট range(2,20,2)-এর মতো:
2 4 6 8 10
একটি অ্যাসোসिएটিভ অ্যারেটও জেনারেটর হিসেবে ইমপ্লিমেন্ট করা যায়:
উদাহরণ
<?php
function arrgenerator($arr){
foreach ($arr as $key=>$val){
yield $key=>$val;
}
}
$arr=array("one"=>1, "two"=>2, "three"=>3, "four"=>4);
$gen=arrgenerator($arr);
foreach ($gen as $key=>$val) echo $key . "=>" . $val . "\n";
?>
আউটপুট
one=>1 two=>2 three=>3 four=>4