परिचय
foreach जैसे लूपिंग कंस्ट्रक्ट का उपयोग करके डेटा के बड़े संग्रह को ट्रैवर्स करने के लिए बड़ी मेमोरी और काफी प्रोसेसिंग समय की आवश्यकता होगी। जेनरेटर के साथ, इन ओवरहेड्स के बिना डेटा के सेट पर पुनरावृत्त करना संभव है। एक जेनरेटर फ़ंक्शन सामान्य फ़ंक्शन के समान होता है। हालांकि, फ़ंक्शन में return स्टेटमेंट के बजाय, जेनरेटर yield कीवर्ड का उपयोग करता है जिसे बार-बार निष्पादित किया जाता है ताकि यह पुनरावृत्ति के लिए मान प्रदान करे।
yield कीवर्ड जेनरेटर मैकेनिज्म का दिल है। भले ही इसका उपयोग return के समान प्रतीत होता है, यह फ़ंक्शन का निष्पादन नहीं रोकता। यह पुनरावृत्ति के लिए अगला मान प्रदान करता है और फ़ंक्शन के निष्पादन को रोक देता है।
सिंटैक्स
Generator implements Iterator {
/* Methods */
public current ( void ) : mixed
public getReturn ( void ) : mixed
public key ( void ) : mixed
public next ( void ) : void
public rewind ( void ) : void
public send ( mixed $value ) : mixed
public throw ( Throwable $exception ) : mixed
public valid ( void ) : bool
public __wakeup ( void ) : void
}
मेथड्स
- public Generator::current() - यील्डेड मान प्राप्त करता है
- public Generator::getReturn() - जेनरेटर का रिटर्न मान प्राप्त करता है
- public Generator::key() - यील्डेड मान की कुंजी प्राप्त करता है
- public Generator::next() - जेनरेटर का निष्पादन जारी रखता है।
Generator::send()को NULL आर्गुमेंट के साथ कॉल करने के समान प्रभाव। - public Generator::rewind() - इटरेटर को रिवाइंड करता है। यदि पुनरावृत्ति पहले ही शुरू हो चुकी है, तो यह एक्सेप्शन फेंकेगा।
- public Generator::send() - दिए गए मान को वर्तमान yield एक्सप्रेशन के परिणाम के रूप में जेनरेटर को भेजता है और जेनरेटर को जारी रखता है।
- public Generator::throw() - जेनरेटर में एक्सेप्शन फेंकता है और जेनरेटर के निष्पादन को जारी रखता है।
- public Generator::valid() - जांचता है कि इटरेटर बंद हुआ है या नहीं
- public Generator::__wakeup() - एक्सेप्शन फेंकता है क्योंकि जेनरेटर सीरियलाइज़ नहीं किए जा सकते।
Generator क्लास Iterator इंटरफेस इम्प्लीमेंट करती है। Generator ऑब्जेक्ट new के माध्यम से इंस्टेंटिएट नहीं किए जा सकते। yield कीवर्ड वाली कोई भी यूजर-डिफाइंड फ़ंक्शन Generator क्लास का ऑब्जेक्ट बनाती है।
Generator उदाहरण
चूंकि जेनरेटर Iterator इंटरफेस इम्प्लीमेंट करता है, foreach लूप का उपयोग यील्डेड मानों को ट्रैवर्स करने के लिए किया जा सकता है।
<?php
function squaregenerator() {
for ($i = 1; $i <= 5; $i++) {
yield $i * $i;
}
}
$gen = squaregenerator();
foreach ($gen as $val) {
echo $val . " ";
}
?>
आउटपुट
1 4 9 16 25
निम्न उदाहरण जेनरेटर क्लास के current() और next() मेथड का उपयोग करके यील्डेड मानों को ट्रैवर्स करता है। लूप कंडीशन valid() मेथड से जांची जाती है।
उदाहरण
<?php
function squaregenerator() {
for ($i = 1; $i <= 5; $i++) {
yield $i * $i;
}
}
$gen = squaregenerator();
while ($gen->valid()) {
echo "key: " . $gen->key() . " value: " . $gen->current() . "\n";
$gen->next();
}
?>
आउटपुट
key: 0 value: 1 key: 1 value: 4 key: 2 value: 9 key: 3 value: 16 key: 4 value: 25
मुख्य लाभ: मेमोरी कुशल - सभी मान एक साथ मेमोरी में नहीं रखे जाते; आलसी मूल्यांकन।