В PHP все объекты (и ресурсы) всегда передаются по указателю, в отличии от скаляров (и массивов), которые передаются по значению.
Передавая один и тот же объект в каждом "тике" цикла и возвращая его же - ты всегда будешь работать с одним и тем же объектом и патчить его же. Ваш Капитан Документация.
Так что отвечая на вопрос - копать в сторону изучения передачи аргументов в PHP. Это не больно. Т.е. в сторону документации.
P.S. Если переписать конкретно этот код на "человеческий" PHP, то выглядеть он должен так:
class ResultIterator extends \ArrayIterator
{
public function __construct(array $array, object $object)
{
foreach ($array as $value) {
$this->append(Util::ArrayToClass(clone $object, $value));
}
}
}
Но вообще проблема не в нём, а в "ArrayToClass", который занимается манки-патчингом и заставляет клонировать объекты.