Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> PHP

PHP जेनरेटर्स बनाम Iterator ऑब्जेक्ट्स: तुलना और उपयोग


परिचय

जब एक जेनरेटर फंक्शन कॉल किया जाता है, तो आंतरिक रूप से 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");
?>
  1. - PHP में Object Array से Property Extract करना

    Objects के array से specific property निकालकर simple array बनाने के कई तरीके हैं। उदाहरण Data rahul@example.com], ]; विधि 1: array_column() (PHP 5.5+ अनुशंसित) 59 ) विधि 2: array_map() (सभी PHP versions) name ]; }, $users); विधि 3: foreach Loop (सबसे स्पष्ट, सबसे नियंत्रण) name . (सीनियर

  1. - PHP में Anonymous Objects बनाना

    PHP 7+ में Anonymous Classes का उपयोग करके on-the-fly objects create करना। मूल Syntax (PHP 7+) greet(); // Hello, Anonymous! Parent Class Extend करना getFullInfo(); Interface Implement करना getLogs()); Constructor Arguments Pass करना request(/users); Use Cases Use CaseExample Test Doubles

  1. - पायथन में जेनरेटर्स

    जेनरेटर्स पायथन में एक शक्तिशाली फीचर हैं (PEP 255 से) जो मेमोरी-कुशल इटरेशन सक्षम करते हैं। जेनरेटर क्या है? def कीवर्ड से परिभाषित फ़ंक्शन जिसमें yield हो। return के बजाय yield मान लौटाता है। कॉल करने पर जेनरेटर ऑब्जेक्ट (इटरेटर) लौटाता है। राज्य (लोकल वेरिएबल्स) yield पर सस्पेंड होता है और अगले