क्या है yield
?
yield
कीवर्ड एक जनरेटर समारोह से रिटर्न डेटा:
एक जनरेटर फ़ंक्शन का दिल उपज कीवर्ड है। अपने सरलतम रूप में, एक उपज स्टेटमेंट एक रिटर्न स्टेटमेंट की तरह दिखता है, सिवाय इसके कि फ़ंक्शन के निष्पादन को रोकने और लौटने के बजाय, उपज जनरेटर पर कोड लूपिंग के लिए एक मूल्य प्रदान करता है और जनरेटर फ़ंक्शन के निष्पादन को रोक देता है।
जनरेटर फ़ंक्शन क्या है?
Iterator लिखने के लिए एक जनरेटर फ़ंक्शन प्रभावी रूप से एक अधिक कॉम्पैक्ट और कुशल तरीका है । यह आपको एक फ़ंक्शन (आपके xrange
) को परिभाषित करने की अनुमति देता है जो आपके द्वारा लूप करते समय मूल्यों की गणना और वापसी करेगा :
foreach (xrange(1, 10) as $key => $value) {
echo "$key => $value", PHP_EOL;
}
यह निम्न आउटपुट तैयार करेगा:
0 => 1
1 => 2
…
9 => 10
आप यह भी नियंत्रित कर सकते हैं $key
में foreach
उपयोग करके
yield $someKey => $someValue;
जनरेटर फ़ंक्शन में, $someKey
जो कुछ भी आप चाहते हैं वह दिखाई देता है $key
और $someValue
इसमें मूल्य है $val
। सवाल के उदाहरण में $i
।
सामान्य कार्यों में क्या अंतर है?
अब आपको आश्चर्य हो सकता है कि हम उस आउटपुट को प्राप्त करने के लिए केवल PHP के मूल range
फ़ंक्शन का उपयोग क्यों नहीं कर रहे हैं । और सही तुम हो। आउटपुट समान होगा। अंतर यह है कि हम वहां कैसे पहुंचे।
जब हम range
PHP का उपयोग करते हैं, तो इसे निष्पादित करेंगे, मेमोरी में संख्याओं के पूरे सरणी और return
उस पूरे सरणी को foreach
लूप में बनाएंगे जो तब उस पर जाएंगे और मूल्यों को आउटपुट करेंगे। दूसरे शब्दों में, foreach
वसीयत सरणी पर ही संचालित होगी। range
समारोह और foreach
केवल "बात" एक बार। इसे ऐसे समझें जैसे मेल में पैकेज मिलना। वितरण आदमी आपको पैकेज सौंप देगा और छोड़ देगा। और फिर आप पूरे पैकेज को खोल देते हैं, जो कुछ भी वहां है उसे बाहर निकालते हैं।
जब हम जनरेटर फ़ंक्शन का उपयोग करते हैं, तो PHP फ़ंक्शन में कदम रखेगा और इसे निष्पादित करेगा जब तक कि यह या तो अंत या किसी yield
कीवर्ड से नहीं मिलता है । जब यह एक मिलता है yield
, तो यह उस समय जो बाहरी लूप के लिए मान है वह वापस कर देगा। फिर यह जनरेटर फ़ंक्शन में वापस चला जाता है और जहां से यह निकलता है, वहां से जारी रहता है। चूँकि आपका लूप xrange
पकड़ता है for
, यह तब तक क्रियान्वित और पैदावार करेगा जब तक $max
कि पहुँच नहीं गया। इसके बारे में सोचो foreach
और जनरेटर पिंग पोंग की तरह।
मुझे इसकी आवश्यकता क्यों है?
जाहिर है, जनरेटर का उपयोग मेमोरी सीमा के आसपास काम करने के लिए किया जा सकता है। अपने परिवेश के आधार पर, range(1, 1000000)
अपनी स्क्रिप्ट को घातक बनाना , जबकि एक जनरेटर के साथ एक ही ठीक काम करेगा। या विकिपीडिया के रूप में इसे डालता है:
क्योंकि जनरेटर केवल मांग पर अपने उपज मूल्यों की गणना करते हैं, वे अनुक्रमों का प्रतिनिधित्व करने के लिए उपयोगी होते हैं जो एक बार में महंगा या असंभव होगा। इनमें अनंत क्रम और लाइव डेटा स्ट्रीम शामिल हैं।
जेनरेटर भी बहुत तेज़ होने वाले हैं। लेकिन ध्यान रखें कि जब हम उपवास के बारे में बात कर रहे होते हैं, तो हम आम तौर पर बहुत कम संख्या में बात कर रहे होते हैं। तो इससे पहले कि आप अब भाग जाएं और जनरेटर का उपयोग करने के लिए अपने सभी कोड को बदल दें, एक बेंचमार्क करें, जहां यह समझ में आता है।
जनरेटरों के लिए एक और उपयोग मामला अतुल्यकालिक कोरटाइन है। yield
कीवर्ड केवल मान वापस नहीं करता है, लेकिन यह भी उन्हें स्वीकार करता है। इस पर जानकारी के लिए, नीचे दिए गए दो उत्कृष्ट ब्लॉग पोस्ट देखें।
कब से उपयोग कर सकता हूं yield
?
PHP 5.5 में जेनरेटर पेश किए गए हैं । yield
उस संस्करण से पहले उपयोग करने की कोशिश करने से कीवर्ड के बाद आने वाले कोड के आधार पर विभिन्न पार्स त्रुटियों का परिणाम होगा। इसलिए यदि आपको उस कोड से कोई पार्स त्रुटि मिलती है, तो अपने PHP को अपडेट करें।
स्रोत और आगे पढ़ने:
yeild
हैं, कहते हैं, इस तरह का एक समाधान: ideone.com/xgqevM