2014-12-02 29 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() 。

希望这将帮助其他用户无法面对这个问题,不要浪费自己的时间......