2009-09-02 17 views
5

कोशिश करें क्योंकि मैं शायद अपने सिर को इटरेटर इटरेटर क्लास के आसपास नहीं कर सकता। मैं समझता हूं कि कक्षाएं ट्रैवर्सबल को कार्यान्वित कर सकती हैं ताकि इंजन जानता है कि यह फोरैच और का उपयोग करके लूप कर सकता है। मुझे एहसास है कि IteratorIterator को किसी भी इटरेटर में ट्रैवर्सबल में कनवर्ट करने योग्य माना जाता है लेकिन मैं समझ नहीं सकता कि कैसे मेरे जीवन के बारे में समझते हैं।PHP IteratorIterator क्लास कैसे काम करता है?

उदाहरण के लिए लें, PDOStatement कक्षा; पीडीओएसटेमेंट पर पुनरावृत्ति की अनुमति देने के लिए मानक इटरेटर विधियों (अगली, कुंजी, रिवाइंड इत्यादि) को कैसे लागू किया जाएगा?

क्षमा करें अगर मेरा प्रश्न अस्पष्ट है, तो मैं इस कक्षा के लिए सही कारण समझने के लिए संघर्ष कर रहा हूं और इसके बारे में दस्तावेज कम है।

धन्यवाद,

विल

अद्यतन: phpt फ़ाइलों के माध्यम से जा रहे हैं, मैं एक परीक्षण है जो उपयोग करता पाया IteratorIterator:

<?php 

$root = simplexml_load_string('<?xml version="1.0"?> 
<root> 
    <child>Hello</child> 
    <child>World</child> 
</root> 
'); 

foreach (new IteratorIterator($root->child) as $child) { 
    echo $child."\n"; 
} 

?> 

अपेक्षित आउटपुट है:

Hello 
World 

मैं वास्तव में पालन नहीं करता कि IteratorIterator निर्माण $ root-> बच्चे के रूप में कैसे लेता है एक तर्क और यह कैसे बाल तत्वों पर पुनरावृत्त करने के लिए प्रबंधन करता है।

+0

मैं इस सवाल का जवाब [यहां] पाया (http://blog.ircmaxell.com/2011/10/iteratoriterator-php-inconsistencies.html)। लेकिन ऐसा लगता है कि IteratorIterator अब थोड़ा महत्व बन गया है, है ना? – akond

उत्तर

1

this पर आधारित, मुझे लगता है कि यह आपको इटरेटेड ऑब्जेक्ट्स पर इटरेट करने की अनुमति देता है। अर्थात। आप अपने मास्टर ऑब्जेक्ट में अन्य ऑब्जेक्ट्स खींच सकते हैं और अपने मास्टर ऑब्जेक्ट पर इटरेटर इटरेटर का उपयोग कर सकते हैं, बच्चे ऑब्जेक्ट्स को भी इटरेट कर सकते हैं।

अद्यतन: आपके अपडेट के आधार पर। यह मुझे समझ में आता है, यद्यपि केवल एक मूल वस्तु है, इसलिए इसे पुनरावृत्ति करना वास्तव में इस उदाहरण में लागू नहीं होता है, लेकिन यदि आप अधिक रूट ऑब्जेक्ट्स कर सकते हैं तो आप कर सकते हैं। दूसरे शब्दों में, मेरा मानना ​​है कि इटरेटर इटरेटर प्रत्येक ऑब्जेक्ट के सभी तत्वों को जानने के बिना, नेस्टेड फोरैच लूप होने जैसा ही है। दूसरे शब्दों में, ऑब्जेक्ट ओरिएंटेड ऑब्जेक्ट्स का उपयोग करके एक नेस्टेड फोरैच ... एक अनावश्यक कथन है। :-)

0

मैंने सोचा उदाहरण # 2 here काफी सीधे आगे है ...
यह मूल रूप से आप अगले/पिछले/वर्तमान/रिवाइंड/कुंजी सरणी काम करता है, php foreach पार्सर द्वारा की उम्मीद के लिए अपने वर्ग के लिए एक विशिष्ट व्यवहार को लागू करने देता है ।

इसलिए आपके प्रश्न को लागू करने के लिए, एक पीडीओएसएटमेंट के साथ एक आईटरेटर क्लास को इसके मेमेबर के रूप में बनाएगा, उदाहरण के लिए पीडीओएसटेमेंट :: fetch को अपने अगले कथन को वापस करने के लिए अगली विधि का उपयोग करें। इसे संग्रहीत करने से आप दोनों को निष्क्रिय और वर्तमान लागू कर सकते हैं। इस वर्ग का बहुत अधिक उपयोग नहीं किया है, लेकिन मुझे लगता है कि यह एक कठिन और कुंजी लागू करने के लिए मुश्किल नहीं है। ध्यान दें कि यह फ्लाई पर है इसलिए मैं विवरण पर गलत हो सकता हूं, लेकिन मुझे लगता है कि अवधारणा स्पष्ट होनी चाहिए

+0

मुझे यकीन नहीं है कि मैं अनुसरण करता हूं। उदाहरण जो आपने मानक इटरेटर के बारे में वार्ता से जुड़ा हुआ है, IteratorIterator क्लास (http://us2.php.net/manual/en/class.iteratoriterator.php) नहीं है। कृपया क्या आप स्पष्टीकरण दे सकते हैं? – WilliamMartin

2

यदि आपको अभी तक यह नहीं मिला है, तो https://www.phpro.org/tutorials/Introduction-to-SPL.html में कुछ उदाहरण हैं जो आपकी मदद कर सकते हैं।


IteratorIterator>

  • "यह इटरेटर आवरण कुछ भी है कि है एक इटरेटर में traversable की रूपांतरण की अनुमति देता है।"

traversable>

  • " इंटरफेस (बिल्ट-इन) वर्गों है कि इस इंटरफ़ेस को लागू में इस्तेमाल किया जा सकता है, तो एक वर्ग foreach का उपयोग कर traversable है पता लगाने के लिए। "
  • " आंतरिक एक foreach निर्माण और IteratorAggregate या Iterator को लागू करने की आवश्यकता नहीं है। "
  • " यह एक आंतरिक इंजन इंटरफेस है जो सी PHP स्क्रिप्ट में लागू किया जाना चाहिए। या तो आइटरेटरएग्रीगेट या इटरेटर बजाय प्रयोग किया जाना चाहिए। "

साइट कुछ RecursiveIteratorIterator उदाहरण है कि काम हो सकता है लेकिन, अगर मैं यह सही मिलता है, IteratorIterator दृश्य बहुत बेकार की पटकथा बिंदु से है (जब कम से कम foreach करते थे)।

यह Iterateable traversable इंटरफेस को लागू वस्तुओं से बाहर ऑब्जेक्ट्स बनाता है, लेकिन traversable इंटरफेस को लागू करने प्रशिक्षु कक्षाएं वैसे भी foreachable हैं और लिपियों traversable लागू नहीं कर सकते ...

(डॉक्स, SimpleXMLElement traversable लागू कर रहा है में उल्लेख नहीं)

संबंधित मुद्दे