Avi*_*ida 5 php spl arrayobject
我想知道是什么getIterator(),我会解释:
据我所知,getIterator我们称之为一种方法,包括一个外部迭代器.
问题是getIterator包含它自己的方法,闭包认为看起来是相同的Iterator接口,但它不能是一个接口,它可以是类,但我试图在SPL.php源代码中搜索它,但没有找到任何,也许我让它变得比实际更复杂,如果有人可以帮助我理解它在SPL.php源代码中的位置以及它是什么(类等),我会很高兴.谢谢大家,祝你有个愉快的一天.
Gor*_*don 12
ArrayObject实现IteratorAggregate,它允许您返回迭代器而不是实现它.这很简单.假设你有一个包装数组的类,比如
class Foo
{
private $array = [1,2,3,4];
}
Run Code Online (Sandbox Code Playgroud)
你想要foreach一个Foo像这样的实例:
foreach (new Foo as $bar) {
echo $bar; // outputs 1234
}
Run Code Online (Sandbox Code Playgroud)
为了实现这一目标,您可以添加Iterator接口,但是您必须在接口中实现所有方法,以便在对象内迭代数组.您不希望在需要该功能时反复复制该代码,特别是因为已经有一个Iterator可以执行您想要的操作.所以不是实现Iterator你的实现IteratorAggregate
class Foo implements IteratorAggregate
{
private $array = [1,2,3,4];
public function getIterator()
{
return new ArrayIterator($this->array);
}
}
Run Code Online (Sandbox Code Playgroud)
现在,当您执行foreachPHP时,将使用返回的Iterator getIterator而不是Foo实例本身,允许您获取输出1234.
在这种情况下ArrayObject,重点是让你foreach超过的价值ArrayObject.当然,您也可以打电话给getIterator自己,因为它是公开的,然后直接使用返回的Iterator.
还要注意ctor签名ArrayObject:
public __construct (
[ mixed $input
[, int $flags = 0
[, string $iterator_class = "ArrayIterator"
]]] )
Run Code Online (Sandbox Code Playgroud)
注意哪个Iterator将被退回.