Я обнаружил ошибку в 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’) также должен быть удален, что не потому, что пропустить в первом цикле.
Я обнаружил ошибку в методе SplObjectStorage Detach ():
Отсоединение текущей записи от хранилища не позволяет SplObjectStorage :: next () работать.
таким образом, предотвращая выполнение объекта Next при выполнении Detach (), итерация никогда не достигнет второго (следующего) объекта stdClass. SplObjectStorage :: next () очевидно полагается на текущий элемент, чтобы быть действительным.
Чтобы избежать этой ошибки в классе SplObjectStorage, нам нужно вызвать next ()
перед вызовом detach ().
Надеюсь, что это поможет другим пользователям не сталкиваться с этой проблемой и не тратить свое время …
Других решений пока нет …