我想了解 getIterator()
是什么,我会解释一下:
据我所知getIterator
是一种我们称之为包含外部迭代器的方法。
问题是getIterator包含它自己的方法关闭认为看起来与Iterator接口相同但它不能是一个接口它可以是类但我试图在SPL中搜索它。 php源代码并没有找到任何,也许我让它变得比实际更复杂,如果有人可以帮助我理解它在SPL.php源代码的位置以及它是什么(我会很高兴,等等)。谢谢大家,祝你有个愉快的一天。
答案 0 :(得分:12)
ArrayObject
实现IteratorAggregate
,它允许您返回迭代器而不是实现它。这很简单。假设你有一个包装数组的类,比如
class Foo
{
private $array = [1,2,3,4];
}
并希望foreach
覆盖Foo
的实例,如下所示:
foreach (new Foo as $bar) {
echo $bar; // outputs 1234
}
要实现这一点,您可以添加Iterator
接口,但是您必须在接口中实现所有方法,以便在对象内迭代数组。您不希望在需要该功能时反复复制该代码,特别是因为已经有一个Iterator可以执行您想要的操作。因此,不是实施Iterator
,而是实施IteratorAggregate
class Foo implements IteratorAggregate
{
private $array = [1,2,3,4];
public function getIterator()
{
return new ArrayIterator($this->array);
}
}
现在当你执行foreach
PHP时,将使用从getIterator
返回的Iterator而不是Foo
实例本身,允许您获取输出1234.
如果是ArrayObject
,则只需要foreach
ArrayObject
上的getIterator
。当然,您也可以自己致电ArrayObject
,因为它是公开的,然后直接使用返回的Iterator。
另请注意public __construct (
[ mixed $input
[, int $flags = 0
[, string $iterator_class = "ArrayIterator"
]]] )
:
{{1}}
注意到将返回哪个迭代器。