मुझे परेशान है कि क्यों ArrayIterator
पर उप-वर्ग को इसकी __construct
विधि कभी नहीं मिल रही है। इस उदाहरण पर विचार:ArrayIterator subclass के निर्माता को कभी क्यों नहीं कहा जाता है?
<?php
class ConstructorException extends Exception {}
class Foo extends ArrayObject {
function __construct($arr = array(), $flags = 0, $iterator = 'ArrayIterator') {
$iterator = 'FooIterator';
parent::__construct($arr, $flags, $iterator);
}
}
class FooIterator extends ArrayIterator {
function __construct($array = array(), $flags = 0) {
throw new ConstructorException('HELLO WORLD'); // I AM NEVER CALLED.
parent::__construct($array, $flags);
}
}
try {
$f = new Foo(array(1, 2, 3));
$it = $f->getIterator();
if (get_class($it) !== 'FooIterator') {
throw new Exception('Expected iterator to be FooIterator.');
}
die("FAIL\n");
} catch (ConstructorException $e) {
die("PASS\n");
} catch (\Exception $e) {
die(sprintf("ERROR: %s\n", $e->getMessage()));
}
दोनों पीएचपी 5.4 एक 5.5 में, परिणाम FAIL
है। क्यूं कर?
जॉन: http://3v4l.org/HnFQm
बिना किसी अपवाद के पिछला कोड, लेकिन उस iterator काम अच्छी तरह से दिखा वर्ग फू में) विधि getIterator की परिवर्तन (के साथ (सूचकांक और unsetting से जोड़ने) ब्लैकबर्न नोट करता है कि यह एचएचवीएम में काम करता है: http://3v4l.org/e9qF9/https://twitter.com/johnbillion/status/601900452293300224 –
के माध्यम से यह php में एक आंतरिक समस्या प्रतीत होता है। [spl_array_object_new_ex] (https://github.com/php/php-src/blob/master/ext/spl/spl_array.c#L143) अभिभावक के कन्स्ट्रक्टर को कॉल न करें। इसकी सूचना दी जानी चाहिए? – Federkun
बिल्ट-इन ऑब्जेक्ट्स पर कन्स्ट्रक्टर्स थोड़ा मजेदार हैं - उदाहरण के लिए नोट करें कि [SimpleXMLElement अपने कन्स्ट्रक्टर को 'अंतिम' होने की घोषणा करता है] (http://php.net/manual/en/simplexmlelement.construct।php), ताकि subclasses सही कारखाने की प्रक्रिया के माध्यम से जाना है। यह 'ArrayIterator' के बारे में सच नहीं है, हालांकि, शायद यह सिर्फ एक बग है। – IMSoP