我在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-&gt; attr =&#39; 2&#39;)也应该删除,这不是因为在第一个循环中跳过。
答案 0 :(得分:1)
我在SplObjectStorage Detach()方法中发现了一个错误:
从存储中分离当前条目会阻止SplObjectStorage :: next()运行。
因此,当Detach()执行时阻止Next对象,迭代永远不会到达第二个(下一个)stdClass对象。 SplObjectStorage :: next()显然依赖当前元素有效。
为了避免SplObjectStorage类中的这个错误,我们需要调用next() 在调用detach()之前。
希望这有助于其他用户不要面对这个问题而不是浪费时间......