PHP8 - SplFixedArray 迭代器的 next() 不移动键指针
PHP8 - SplFixedArray iterator's next() doesn't move key pointer
请看一下这段代码:
<?php
$array = new SplFixedArray(1);
print "\nKey1: " . $array->getIterator()->key();
$array->setSize(5);
$array->getIterator()->next();
$array->getIterator()->next();
$array->getIterator()->next();
print "\nKey2: " . $array->getIterator()->key() . "\n";
/*
Result (PHPv8.1.5):
Key1: 0
Key2: 0
*/
在这种情况下,Key1 和 Key2 不应该相同 (0),而是从 0 (key1) 移动到 3 (key2),我说得对吗?
在使用 splFixedArray 的 PHP8 中,他们强制使用迭代器,因此它现在是嵌套循环安全的。但是通过 ->next() 进行迭代似乎...不进行迭代。所以指针还在位置0.
是PHP8的错误还是我的代码有误?
谢谢。
这不是 PHP 方面的任何错误。它按预期工作。问题出在您的代码上。
$array->getIterator()
上面的行总是 return 迭代器的新实例。它不遵循任何单例模式每次 return 相同的实例。因此,如果您希望使用迭代器移动内部指针并打印值,请将实例收集到一个变量中并使用相同的变量每次调用 next()
,如下所示:
<?php
$array = new SplFixedArray(1);
print "\nKey1: " . $array->getIterator()->key();
$array->setSize(5);
$it = $array->getIterator();
$it->next();
$it->next();
$it->next();
print "\nKey2: " . $it->key() . "\n";
请看一下这段代码:
<?php
$array = new SplFixedArray(1);
print "\nKey1: " . $array->getIterator()->key();
$array->setSize(5);
$array->getIterator()->next();
$array->getIterator()->next();
$array->getIterator()->next();
print "\nKey2: " . $array->getIterator()->key() . "\n";
/*
Result (PHPv8.1.5):
Key1: 0
Key2: 0
*/
在这种情况下,Key1 和 Key2 不应该相同 (0),而是从 0 (key1) 移动到 3 (key2),我说得对吗? 在使用 splFixedArray 的 PHP8 中,他们强制使用迭代器,因此它现在是嵌套循环安全的。但是通过 ->next() 进行迭代似乎...不进行迭代。所以指针还在位置0.
是PHP8的错误还是我的代码有误?
谢谢。
这不是 PHP 方面的任何错误。它按预期工作。问题出在您的代码上。
$array->getIterator()
上面的行总是 return 迭代器的新实例。它不遵循任何单例模式每次 return 相同的实例。因此,如果您希望使用迭代器移动内部指针并打印值,请将实例收集到一个变量中并使用相同的变量每次调用 next()
,如下所示:
<?php
$array = new SplFixedArray(1);
print "\nKey1: " . $array->getIterator()->key();
$array->setSize(5);
$it = $array->getIterator();
$it->next();
$it->next();
$it->next();
print "\nKey2: " . $it->key() . "\n";