ভূমিকা
যখন একটি জেনারেটর ফাংশন কল করা হয়, ইন্টারন্যালি Generator ক্লাসের একটি নতুন অবজেক্ট রিটার্ন করা হয়। এটি Iterator ইন্টারফেস ইমপ্লিমেন্ট করে। ইটারেটর ইন্টারফেস নিচের অ্যাবস্ট্রাক্ট মেথডগুলো ডিফাইন করে:
- Iterator::current — বর্তমান এলিমেন্ট রিটার্ন করে
- Iterator::key — বর্তমান এলিমেন্টের কি রিটার্ন করে
- Iterator::next — পরবর্তী এলিমেন্টে যাওয়া
- Iterator::rewind — ইটারেটরকে প্রথম এলিমেন্টে রিসেট করা
- Iterator::valid — বর্তমান পজিশন বৈধ কিনা চেক করা
জেনারেটর একটি ফরওয়ার্ড-অনলি ইটারেটর অবজেক্টের মতো কাজ করে, এবং মেথড প্রদান করে যা কল করা যেতে পারে জেনারেটর-এর স্টেট ম্যানিপুলেট করতে, যার মধ্যে মান পাঠানো এবং মান রিটার্ন করা অন্তর্ভুক্ত।
ইটারেটর হিসেবে জেনারেটর
নিচের উদাহরণে, জেনারেটর ফাংশন একটি ফাইলের লাইনগুলো yield করে একটি জেনারেটর অবজেক্টে যেটি foreach লুপ দিয়ে ট্রাভার্স করা যায়। Iterator মেথড যেমন current() এবং next()ও আহ্বান করা যেতে পারে। তবে, যেহেতু জেনারেটর ফরওয়ার্ড-অনলি ইটারেটর, rewind() মেথড কল করলে এক্সেপশন থ্রো করে।
উদাহরণ
<?php
function filegenerator($name) {
$fileHandle = fopen($name, 'r');
while ($line = fgets($fileHandle)) {
yield $line;
}
fclose($fileHandle);
}
$name="test.txt";
$file=filegenerator($name);
foreach ($file as $line) echo $line;
$file->rewind();
echo $file->current();
$file->next();
echo $file->current();
?>
আউটপুট
ফাইল লাইনগুলো ট্রাভার্স করার পর নিচের ফেটাল এরর দেখানো হয়:
PHP User Defined Functions PHP Function Arguments PHP Variable Functions PHP Internal (Built-in) Functions PHP Anonymous functions PHP Arrow Functions PHP Fatal error: Uncaught Exception: Cannot rewind a generator that was already run