[英]SplObjectStorage - detach behaviour
他的評論可能不是最好的,但我想知道為什么以下腳本的輸出“留在存儲中:2”? 為什么“輸出:”不顯示“2”。
我希望在分離所有對象后存儲空為空。
<?php
class A {
public $i;
public function __construct($i) {
$this->i = $i;
}
}
$container = new \SplObjectStorage();
$container->attach(new A(1));
$container->attach(new A(2));
$container->attach(new A(3));
$container->attach(new A(4));
$container->attach(new A(5));
foreach ($container as $item) {
echo $item->i . "\n";
$container->detach($item);
}
echo "== Left in storage ==\n";
foreach ($container as $item) {
echo $item->i . "\n";
}
/* Outputs:
1
3
4
5
== Left in storage ==
2
*/
這是因為通過detach
foreach
循環內的對象,這可以防止SplObjectStorage::next
正常工作。 我能夠在PHP文檔中的這個用戶貢獻說明中找到這些信息(所以請考慮它的價值)。
如果要在迭代期間分離對象,則應在取消引用對象之前調用next()並在next()之后分離引用
還有一個關於此的bug報告,顯然它不起作用的原因是因為,在分離時,該方法會倒回容器的內部數組指針,這是在循環內部分離時導致破壞的原因。
在您的情況下,按照該注釋,您可以像這樣更改從存儲容器中刪除對象的循環,它應該按預期工作:
$container->attach(new A(1));
$container->attach(new A(2));
$container->attach(new A(3));
$container->attach(new A(4));
$container->attach(new A(5));
$container->rewind();
while ($container->valid()) {
$item = $container->current();
echo $item->i . "\n";
$container->next();
$container->detach($item);
}
/* Outputs:
1
2
3
4
5
== Left in storage ==
*/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.