文件說明「檢查雙向鏈結串列是否包含更多節點」。我不認為這是正確的。
範例
$dlist = new SplDoublyLinkedList;
$data=[1,2,3,4,5];
foreach($data as $d)
$dlist->push($d);
$dlist->rewind();
for($i=0;$i<6;$i++)
{
$currentValue = $dlist->current();
$currentValid = $dlist->valid();
$status = $currentValid ? 'True' : 'False';
echo '目前的值是:' . $currentValue . ' 有效狀態是:' . $status . "\n";
$dlist->next();
}
輸出
目前的值是:1 有效狀態是:True
目前的值是:2 有效狀態是:True
目前的值是:3 有效狀態是:True
目前的值是:4 有效狀態是:True
目前的值是:5 有效狀態是:True
目前的值是: 有效狀態是:False
請注意,當我們位於串列的最後一個節點,值為 5 時,valid() 函式會返回 true。然而,我們已經位於串列的最後一個節點,沒有更多節點了。如果 valid() 函式正在檢查串列上是否還有更多節點,它應該返回 false,而不是 true。
如果您查看 Iterator::valid 的文件,它會說明「檢查目前位置是否有效」。我相信 valid() 的作用確實如此,它會檢查*目前*位置是否有效,*而不是*檢查是否還有更多節點。
請注意這一點,否則它會造成問題。您可能會很順利地迭代到串列的末尾,執行 valid(),認為還有一個節點,執行 next(),擷取值,結果卻得到 null 而不是串列的最後一個節點。