Я сбиваю с толку, почему подкласс до ArrayIterator
никогда не получает вызванный метод __construct
. Рассмотрим следующий пример:Почему конструктор подкласса ArrayIterator никогда не вызывал?
<?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()));
}
В обоих PHP 5.4 5.5, результат FAIL
. Зачем?
Джон Blackbourn отмечает, что он работает в HHVM: http://3v4l.org/e9qF9/via 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), так что подклассы должны пройти правильную заводскую процедуру. Это не относится к 'ArrayIterator', хотя, возможно, это просто ошибка. – IMSoP