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 हस्ताक्षर ध्यान दें।
** एसपीएल ** स्वयं न तो कक्षा है और न ही इंटरफ़ेस है। यह इंटरफेस और कक्षाओं का एक संग्रह है जो कि किसी प्रकार की लाइब्रेरी है। [PHP एसपीएल] (http://www.php.net/manual/en/intro.spl.php)। इसके अलावा 'getIterator() 'एक आंतरिक' PHP' फ़ंक्शन या विधि नहीं है। क्या आप बाहरी पुस्तकालय का उपयोग कर रहे हैं? –
@ciriusrob ओपी 'IteratorAggregate :: getIterator() ' – Gordon
धन्यवाद @ गॉर्डन को रेफर कर रहा है। मैंने सोचा कि वह 'getterter()' को स्वयं से बुला रहा था लेकिन 'IteratorAggregate' इंटरफ़ेस पर नहीं। पारितोषिक के लिए धन्यवाद। –