文档中写着“检查双向链表是否包含更多节点”。我不认为这是正确的。
示例
$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 而不是列表的最后一个节点。