परिचय
लूपिंग कंस्ट्रक्शन जैसे foreach . का उपयोग करके डेटा के बड़े संग्रह को ट्रैवर्स करना बड़ी मेमोरी और काफी प्रोसेसिंग समय की आवश्यकता होगी। जनरेटर . के साथ इन ओवरहेड्स के बिना डेटा के एक सेट पर पुनरावृति करना संभव है। एक जनरेटर फ़ंक्शन एक सामान्य फ़ंक्शन के समान होता है। हालांकि, किसी फ़ंक्शन में रिटर्न स्टेटमेंट के बजाय, जनरेटर यील्ड . का उपयोग करता है कीवर्ड को बार-बार निष्पादित किया जाना है ताकि यह पुनरावृत्त होने के लिए मान प्रदान करे।
उपज कीवर्ड जनरेटर तंत्र का दिल है। भले ही इसका उपयोग वापसी के समान प्रतीत होता है, यह फ़ंक्शन के निष्पादन को नहीं रोकता है। यह पुनरावृत्ति के लिए अगला मान प्रदान करता है और फ़ंक्शन के निष्पादन को रोकता है।
सिंटैक्स
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 }
तरीके
सार्वजनिक जेनरेटर::वर्तमान (शून्य) - मिश्रित - प्राप्त मूल्य प्राप्त करें
सार्वजनिक जेनरेटर::getReturn (शून्य):मिश्रित - जनरेटर का रिटर्न वैल्यू प्राप्त करें
सार्वजनिक जेनरेटर::कुंजी (शून्य) - मिश्रित — प्राप्त मूल्य की कुंजी प्राप्त करता है।
सार्वजनिक जेनरेटर::अगला (शून्य) - शून्य - जनरेटर का निष्पादन फिर से शुरू करें। तर्क के रूप में NULL के साथ जेनरेटर ::भेजें () को कॉल करने के समान प्रभाव।
सार्वजनिक जेनरेटर::रिवाइंड (शून्य) - शून्य - इटरेटर को रिवाइंड करें। यदि पुनरावृत्ति पहले ही शुरू हो चुकी है, तो यह एक अपवाद फेंक देगा।
सार्वजनिक जेनरेटर ::भेजें (मिश्रित $ मूल्य):मिश्रित - वर्तमान उपज अभिव्यक्ति के परिणाम के रूप में जनरेटर को दिया गया मूल्य भेजता है और जनरेटर को फिर से शुरू करता है।
सार्वजनिक जेनरेटर::थ्रो (थ्रोबल $अपवाद) - मिश्रित - जनरेटर में एक अपवाद फेंकता है और जनरेटर का निष्पादन फिर से शुरू करता है।
सार्वजनिक जेनरेटर::मान्य (शून्य) - बूल - जांचें कि क्या इटरेटर बंद कर दिया गया है
सार्वजनिक जेनरेटर::__वेकअप (शून्य) - शून्य - एक अपवाद फेंकता है क्योंकि जनरेटर को क्रमबद्ध नहीं किया जा सकता है।
जेनरेटर क्लास इटरेटर इंटरफेस को लागू करता है। जेनरेटर ऑब्जेक्ट्स को नए के माध्यम से तत्काल नहीं किया जा सकता है। उपज कीवर्ड वाला कोई भी उपयोगकर्ता परिभाषित फ़ंक्शन जेनरेटर क्लास का ऑब्जेक्ट बनाता है।
जनरेटर उदाहरण
चूंकि जनरेटर इटरेटर इंटरफेस को लागू करता है, प्रत्येक लूप के लिए उपज मूल्यों को पार करने के लिए इस्तेमाल किया जा सकता है।
<?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
निम्न उदाहरण जेनरेटर क्लास के करंट () और नेक्स्ट () मेथड्स का उपयोग करता है ताकि यील्ड वैल्यू को ट्रैवर्स किया जा सके। लूप कंडीशन को वैलिड () मेथड से चेक किया जाता है।
उदाहरण
<?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