2014-12-02 32 views
1

我在PHP SplObjectStorage Detach方法中發現了一個錯誤。在移除物體的過程中它可以正常工作,但如果物體相互移動,則會跳過下一個物體。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); 
} 

,這讓我這個結果。這不應該,因爲我想刪除對象(attr == 1)和對象(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')也應被刪除,這是因爲沒有在第一回路跳過。

+0

爲什麼反對票.....如果我沒有問題解釋。你可以檢查代碼(代碼不需要人類語言)。在代碼清楚我分離兩個對象,但它只能刪除一個對象,應該不是... – 2014-12-02 06:33:44

+0

嗨@hakre,你有什麼想法關於這個.... – 2014-12-02 06:58:02

+0

@Alon,PLZ幫助我擺脫這個問題....... – 2014-12-02 06:59:14

回答

1

我已經發現一個錯誤SplObjectStorage拆離其是()方法:

卸下從存儲當前條目防止SplObjectStorage :: next()的操作。

所以通過在Detach()執行時阻止Next對象,迭代將永遠達不到第二個(下一個)stdClass對象。 SplObjectStorage :: next()顯然依賴於當前元素的有效性。

爲了避免SplObjectStorage類中的這個錯誤,我們需要在調用detach()之前調用next() 。

希望這將幫助其他用戶無法面對這個問題,不要浪費自己的時間......