[英]php SplObjectStorage Detach() not working
我在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()運行。
因此,通過在執行Detach()時阻止Next對象,迭代將永遠不會到達第二(下一個)stdClass對象。 SplObjectStorage :: next()顯然取決於當前元素是否有效。
為了避免SplObjectStorage類中的此錯誤,我們需要在調用detach()之前先調用next()。
希望這將幫助其他用戶不要面對這個問題,也不要浪費時間...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.