2012-07-07 21 views
5

मैं समझने के लिए getIterator() है कोशिश कर रहा हूँ, मैं समझा जाएगा:ArrayObject, getIterator();

मुझे पता है के रूप में getIterator एक विधि हम एक बाहरी इटरेटर शामिल करने के लिए कहते हैं।

समस्या getIterator शामिल यह खुद तरीकों बंद लगता है एक ही लग रहा है है इटरेटर इंटरफेस है, लेकिन यह एक अंतरफलक यह वर्ग हो सकता है नहीं किया जा सकता, लेकिन मैं SPL.php स्रोत कोड के अंदर यह खोज करने के लिए कोशिश कर रहा है और कर रहा हूँ कोई भी नहीं मिला, शायद मैं इसे वास्तव में अधिक जटिल बना रहा हूं, मुझे खुशी होगी अगर कोई मुझे यह समझने में मदद कर सकता है कि यह SPL.php स्रोत कोड पर कहां है और यह क्या है (कक्षा, आदि)। सभी का धन्यवाद और आपका दिन शुभ हो।

+0

** एसपीएल ** स्वयं न तो कक्षा है और न ही इंटरफ़ेस है। यह इंटरफेस और कक्षाओं का एक संग्रह है जो कि किसी प्रकार की लाइब्रेरी है। [PHP एसपीएल] (http://www.php.net/manual/en/intro.spl.php)। इसके अलावा 'getIterator() 'एक आंतरिक' PHP' फ़ंक्शन या विधि नहीं है। क्या आप बाहरी पुस्तकालय का उपयोग कर रहे हैं? –

+0

@ciriusrob ओपी 'IteratorAggregate :: getIterator() ' – Gordon

+0

धन्यवाद @ गॉर्डन को रेफर कर रहा है। मैंने सोचा कि वह 'getterter()' को स्वयं से बुला रहा था लेकिन 'IteratorAggregate' इंटरफ़ेस पर नहीं। पारितोषिक के लिए धन्यवाद। –

उत्तर

12

ArrayObject लागू IteratorAggregate जो आपको इसे लागू करने के बजाय एक पुनरावर्तक को वापस करने की अनुमति देता है। यह बहुत सरल है। मान लें कि एक वर्ग एक सरणी लपेटकर, जैसे

class Foo 
{ 
    private $array = [1,2,3,4]; 
} 

Foo का एक उदाहरण के साथ, इस तरह है और आप foreach हैं:

foreach (new Foo as $bar) { 
    echo $bar; // outputs 1234 
} 

प्राप्त करने के लिए आप Iterator इंटरफेस जोड़ सकता है कि लेकिन फिर आप ऑब्जेक्ट के अंदर सरणी को फिर से शुरू करने के सरल कार्य के लिए इंटरफ़ेस में सभी विधियों को लागू करना था। जब भी आपको उस कार्यक्षमता की आवश्यकता होती है, तब आप उस कोड को बार-बार डुप्लिकेट नहीं करना चाहते हैं, खासकर जब से पहले से ही एक इटरेटर है जो आप चाहते हैं। तो बजाय Iterator को लागू करने की आप IteratorAggregate

class Foo implements IteratorAggregate 
{ 
    private $array = [1,2,3,4]; 

    public function getIterator() 
    { 
     return new ArrayIterator($this->array); 
    } 
} 

लागू अब जब आप कर foreach पीएचपी इटरेटर Foo उदाहरण के बजाय getIterator से लौटे का उपयोग करेगा ही आप के मामले में उत्पादन 1234

प्राप्त करने के लिए अनुमति देता है ArrayObject, बिंदु ArrayObject में मानों पर आपको foreach पर अनुमति देने के लिए बस है। बेशक, आप getIterator को भी कॉल कर सकते हैं, क्योंकि यह सार्वजनिक है और फिर सीधे इटरेटर लौटाया जाता है।

public __construct (
    [ mixed $input 
    [, int $flags = 0 
    [, string $iterator_class = "ArrayIterator" 
]]]) 

जो नोटों जिन्हें इटरेटर लौटा दी जाएगी:

इसके अलावा ArrayObject की ctor हस्ताक्षर ध्यान दें।

+0

अब मैं पढ़ रहा हूँ धन्यवाद गॉर्डन। –

+0

धन्यवाद गॉर्डन, अगर मुझे आपका उदाहरण सही मिला, तो ऐरेइटरेटर कन्स्ट्रक्टर नई सरणी को परिभाषित करता है और जब मैं फ्रेच लूप चलाता हूं तो ऑटो अंतर्निहित व्यवहार ArrayIterator विधियों (वर्तमान(), कुंजी(), अगले()) मूल फोरैच लूप के लिए, समस्या यह है कि इस मामले में आप विधि को परिभाषित करने वाले थे Iterator जो ArrayIterator विधियों का उपयोग करते हैं लेकिन ArrayObject क्लास को देखते समय वहां केवल विधि प्राप्त होती है Iterator, लेकिन हम getterter सामग्री पर एक नज़र नहीं देख सकते , PHP मैनुअल कह रहा है "बाहरी इटरेटर पुनर्प्राप्त करें" लेकिन मैं इसे देखना चाहता हूं, जहां यह बाहरी इटरेटर है? –

+0

@uBlankText यह सुनिश्चित नहीं है कि आप क्या खोज रहे हैं, लेकिन आप यहां ArrayObject :: getIterator के कार्यान्वयन की जांच कर सकते हैं: http://lxr.php.net/xref/PHP_5_4/ext/spl/spl_array.c#1277 – Gordon

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

  • कोई संबंधित समस्या नहीं^_^