簡體   English   中英

PHP SplObjectStorage Detach()無法正常工作

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM