Баг пхп с clone или я что-то не допонимаю?

HraKK

Мудак
Команда форума
Баг пхп с clone или я что-то не допонимаю?

PHP:
class a implements Iterator
{
    protected $data = array('a','b','c');

    public function next()
    {
        return next( $this->data );
    }

    public function key()
    {
        return key( $this->data );
    }

    public function current()
    {
        return current( $this->data );
    }

    public function rewind()
    {
        return reset( $this->data );
    }

    public function valid()
	{
		return !is_null( key( $this->data ) );
	}
}
$a = new a();
print $a->current(); //a
print $a->next(); //b
print $a->next(); //c
print $a->next(); //false
print $a->current(); //false
$b = clone $a;
print $a->current(); // a WTF o_O
die();
-~{}~ 29.03.10 18:47:

Вдогонку, это нормальное поведение?
PHP:
$a = array( 1,2,3);
print next($a); // 2
print next($a); // 3
print next($a); // false
print prev($a); // false O_o
 

boombick

boombick.org
Насчет первого, может можно решить с помощью magic-метода __clone? Ну принудительно передать в контекст клонируемого объекта все значения?

А насчет второго сам прифигел :)
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
похоже, clone ресетит указатель
остается только не полагаться на встроенный указатель массива
 

HraKK

Мудак
Команда форума
boombick
Все оно передает, проблема в том что оно ресетит указатели у КЛОНИРУЕМОГО объекта. В случае если он достиг конца - false. Это продолжение бага №2.

-~{}~ 29.03.10 19:51:

grigori
Угу, придется переписывать класс. Капец, я <3 php.
 

HraKK

Мудак
Команда форума
Не знаю как, что и где. Смысла мне это все равно не добавит.
 

boombick

boombick.org
grigori
ну так выше приводили ссылки на багтрекер :) Дропнули с комментом, что это не баг :) Или ты предлагаешь открыть баг про clone?
 

Ирокез

бессмертный пони
Команда форума
Партнер клуба
С первым вполне правильно (согласно коду zend engine), так как при копировании HashTable, указатель текущего значения не копируется (т.е. у $b current будет первый элемент). Соответственно чтобы перебрать элементы $a используют внутренние значение итератора HashTable $a и его не восстанавливают после копирования
 
Сверху