簡體   English   中英

SplObjectStorage - 分離行為

[英]SplObjectStorage - detach behaviour

在PHP文檔頁面上發現了這條評論,並對此感到驚訝。

他的評論可能不是最好的,但我想知道為什么以下腳本的輸出“留在存儲中: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.

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