php SplObjectStorage Detach()不工作

php SplObjectStorage Detach()不工作,php,object,storage,Php,Object,Storage,我在PHP SplObjectStorage分离方法中发现了一个错误。在移除一个对象时效果很好,但如果该对象彼此出现,则会跳过下一个对象 例如: $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-&g

我在PHP SplObjectStorage分离方法中发现了一个错误。在移除一个对象时效果很好,但如果该对象彼此出现,则会跳过下一个对象

例如:

$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);
}

**对象($o2->attr='2')也应该被删除,这不是因为在第一个循环中跳过。

我在SplObjectStorage Detach()方法中发现了一个错误,它是:

从存储器中分离当前条目将阻止SplObjectStorage::next()操作

因此,通过在执行Detach()时阻止下一个对象,迭代将永远不会到达第二个(下一个)stdClass对象。SplObjectStorage::next()显然依赖于当前元素的有效性

为了避免SplObjectStorage类中的此错误,我们需要调用next() 在调用detach()之前


希望这能帮助其他用户不要面对这个问题,也不要浪费时间……

为什么投反对票。。。。。如果我没有解释的话。您可以检查代码(代码不需要人类语言)。代码中很清楚,我分离了两个对象,但它只移除了一个不应该是的对象…嗨@hakre,你对此有什么想法吗…@Alon,请帮我解决这个问题。。。。。。。
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)