我试图了解是什么getIterator()
,我将解释:
据我所知getIterator
,我们调用的方法是包含一个外部迭代器。
问题是 getIterator 包括它自己的方法,关闭者认为看起来相同的是 Iterator 接口,但它不能是接口,它可以是类,但我试图在 SPL.php 源代码中搜索它,但没有找到,也许我让这比实际情况更复杂,如果有人可以帮助我了解它在 SPL.php 源代码中的位置以及它是什么(类等),我会很高兴。谢谢大家,祝你有美好的一天。
我试图了解是什么getIterator()
,我将解释:
据我所知getIterator
,我们调用的方法是包含一个外部迭代器。
问题是 getIterator 包括它自己的方法,关闭者认为看起来相同的是 Iterator 接口,但它不能是接口,它可以是类,但我试图在 SPL.php 源代码中搜索它,但没有找到,也许我让这比实际情况更复杂,如果有人可以帮助我了解它在 SPL.php 源代码中的位置以及它是什么(类等),我会很高兴。谢谢大家,祝你有美好的一天。
ArrayObject
implementsIteratorAggregate
允许你返回一个迭代器而不是实现它。这很简单。假设您有一个包装数组的类,例如
class Foo
{
private $array = [1,2,3,4];
}
并且你想foreach
通过一个实例Foo
,像这样:
foreach (new Foo as $bar) {
echo $bar; // outputs 1234
}
要实现这一点,您可以添加Iterator
接口,但随后您必须实现接口中的所有方法,以完成在对象内迭代数组的简单任务。当您需要该功能时,您不想一遍又一遍地重复该代码,特别是因为已经有一个迭代器可以满足您的需求。所以不是实施Iterator
你实施IteratorAggregate
class Foo implements IteratorAggregate
{
private $array = [1,2,3,4];
public function getIterator()
{
return new ArrayIterator($this->array);
}
}
现在,当您执行此操作时,foreach
PHP 将使用从返回的迭代器getIterator
而不是Foo
实例本身,从而允许您获得输出 1234。
在 的情况下ArrayObject
,这一点只是为了允许您foreach
超过ArrayObject
. 当然,你也可以调用getIterator
自己,因为它是公共的,然后直接使用返回的迭代器。
还要注意 ctor 签名ArrayObject
:
public __construct (
[ mixed $input
[, int $flags = 0
[, string $iterator_class = "ArrayIterator"
]]] )
其中指出将返回哪个迭代器。