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";

Online Demo