我试图理解getIterator()是什么,我会解释:
如我所知,getIterator是我们调用的包含外部Iterator的方法。
问题是getIterator包含了--它自己的方法--关闭时认为是Iterator接口,但是它不能是一个接口,它可以是类,但是我试图在SPL.php源代码中搜索它,但是没有找到,也许我正在使它变得比实际更复杂,如果有人能帮助我理解它在SPL.php源代码中的位置以及它是什么(类等等),我会很高兴的。谢谢大家,祝您今天愉快。
发布于 2012-07-07 08:12:45
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,重点只是允许您对ArrayObject中的值进行foreach。当然,您也可以自己调用getIterator,因为它是公开的,然后直接使用返回的Iterator。
还请注意ArrayObject的ctor签名
public __construct (
[ mixed $input
[, int $flags = 0
[, string $iterator_class = "ArrayIterator"
]]] )哪一个词会被退回。
https://stackoverflow.com/questions/11373318
复制相似问题