परिचय
जब एक जेनरेटर फंक्शन कॉल किया जाता है, तो आंतरिक रूप से Generator क्लास का एक नया ऑब्जेक्ट लौटाया जाता है। यह Iterator इंटरफेस को इम्प्लीमेंट करता है। Iterator इंटरफेस निम्नलिखित एब्स्ट्रैक्ट मेथड्स को परिभाषित करता है:
- Iterator::current - वर्तमान एलिमेंट लौटाता है
- Iterator::key - वर्तमान एलिमेंट की कुंजी लौटाता है
- Iterator::next - अगले एलिमेंट पर आगे बढ़ता है
- Iterator::rewind - इटरेटर को पहले एलिमेंट पर रीवाइंड करता है
- Iterator::valid - चेक करता है कि वर्तमान स्थिति वैध है या नहीं
जेनरेटर एक फॉरवर्ड-ओनली इटरेटर ऑब्जेक्ट की तरह कार्य करता है, और उन मेथड्स को प्रदान करता है जिन्हें जेनरेटर की स्थिति में हेरफेर करने के लिए कॉल किया जा सकता है, जिसमें मान भेजना और उससे मान लौटाना शामिल है।
जेनरेटर के रूप में इटरेटर
निम्न उदाहरण में, जेनरेटर फंक्शन एक फाइल में लाइन्स को एक जेनरेटर ऑब्जेक्ट में यील्ड करता है जिसे foreach लूप का उपयोग करके पार किया जा सकता है। 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
जेनरेटर और Iterator इम्प्लीमेंटेशन में अंतर
| विशेषता | जेनरेटर (yield) | Iterator इम्प्लीमेंटेशन |
|---|---|---|
| कोड जटिलता | सरल, कम बॉयलरप्लेट | 5 मेथड्स इम्प्लीमेंट करने होंगे |
| स्टेट मैनेजमेंट | ऑटोमैटिक (लोकल वेरिएबल्स) | मैन्युअल (प्रॉपर्टीज़ में) |
| रीवाइंड सपोर्ट | नहीं (फॉरवर्ड-ओनली) | हां (rewind() इम्प्लीमेंट करें) |
| मेमोरी | कम (एक समय में एक मान) | इम्प्लीमेंटेशन पर निर्भर |
| मान भेजना | yield एक्सप्रेशन के माध्यम से | संभव नहीं (सीधे) |
| रिटर्न वैल्यू | getReturn() से उपलब्ध (PHP 7.0+) | नहीं |
Generator क्लास के अतिरिक्त मेथड्स
- send($value) - जेनरेटर को मान भेजता है (yield एक्सप्रेशन का परिणाम बन जाता है)।
- throw($exception) - जेनरेटर में एक्सेप्शन फेंकता है।
- getReturn() - जेनरेटर के रिटर्न वैल्यू को प्राप्त करता है (PHP 7.0+)
- valid(), current(), key(), next() - Iterator इंटरफेस मेथड्स।
- rewind() - हमेशा एक्सेप्शन फेंकता है यदि जेनरेटर पहले से चल चुका है।
send() के साथ उदाहरण
<?php
function logger() {
while (true) {
$msg = yield;
echo "LOG: $msg\n";
}
}
$log = logger();
$log->send("First message");
$log->send("Second message");
?>