php SplObjectStorage Detach()无效

时间:2014-12-02 06:02:25

标签: php object storage

我在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;)也应该删除,这不是因为在第一个循环中跳过。

1 个答案:

答案 0 :(得分:1)

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

  

从存储中分离当前条目会阻止SplObjectStorage :: next()运行。

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

  

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

希望这有助于其他用户不要面对这个问题而不是浪费时间......