объект — php SplObjectStorage Detach () не работает

Я обнаружил ошибку в PHP метод SplObjectStorage Detach. Там, где это нормально работает при удалении объекта, но если объект приходит один за другим, он пропускает следующий.

Пример:

$s = new SplObjectStorage();

$o1 = new StdClass;
$o2 = new StdClass;
$o3 = new StdClass;

$o1->attr = '1';
$o2->attr = '2';
$o3->attr = '3';

$s->attach($o1);
$s->attach($o2);
$s->attach($o3);

echo 'Removing Objects...<pre>';
var_dump($s->count());
foreach ($s as $obj) {
var_dump($obj->attr);
if($obj->attr == 2 || $obj->attr == 1) {
echo "Deleting...".$obj->attr;
$s->detach($obj);
}
}

echo 'Checking Objects....';
var_dump($s->count());
foreach ($s as $obj) {
var_dump($obj->attr);
}

и это дает мне этот результат. чего не должно быть, потому что я хочу удалить Object (attr == 1) и Object (attr == 2) оба. Метод Detach () удаляет только первый объект, затем пропускает следующий и затем цикл.

Removing Objects...

int 3

string '1' (length=1)

Deleting...1

string '3' (length=1)Checking Objects....

int 2

string '2' (length=1)

string '3' (length=1)

** Объект ($ o2-> attr = ‘2’) также должен быть удален, что не потому, что пропустить в первом цикле.

1

Решение

Я обнаружил ошибку в методе SplObjectStorage Detach ():

Отсоединение текущей записи от хранилища не позволяет SplObjectStorage :: next () работать.

таким образом, предотвращая выполнение объекта Next при выполнении Detach (), итерация никогда не достигнет второго (следующего) объекта stdClass. SplObjectStorage :: next () очевидно полагается на текущий элемент, чтобы быть действительным.

Чтобы избежать этой ошибки в классе SplObjectStorage, нам нужно вызвать next ()
перед вызовом detach ().

Надеюсь, что это поможет другим пользователям не сталкиваться с этой проблемой и не тратить свое время …

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]