实现的好处ArrayAccess
很简单:您可以访问整个对象或仅访问一个非常特定的,甚至private
是数组的属性。
在这个非常简单的示例中,我们使用Iterator
和ArrayAccess
来访问名为 的特定属性$array
。
class Foo implements \ArrayAccess, \Iterator
{
public $pointer = 0;
private $array = [
'first value',
'second value',
'third value',
];
public function __construct()
{
$this->pointer = 0;
}
public function current()
{
return $this->array[ $this->pointer ];
}
public function key()
{
return $this->pointer;
}
public function next()
{
++$this->pointer;
}
public function rewind()
{
$this->pointer = 0;
}
public function valid()
{
return isset( $this->array[ $this->position ] );
}
}
我们现在可以像遍历每个数组一样遍历它:
$foo = new Foo();
foreach ( $foo as $key => $value )
{
print "Index: {$key} - Value: {$value}".PHP_EOL;
}
正如在前面的示例中所见,我们需要实现所有这些方法只是为了循环并访问已经存在的数据。为了实现ArrayAccess
允许我们实际设置值的 ,我们必须实现另一组方法:
ArrayAccess {
abstract public boolean offsetExists ( mixed $offset )
abstract public mixed offsetGet ( mixed $offset )
abstract public void offsetSet ( mixed $offset , mixed $value )
abstract public void offsetUnset ( mixed $offset )
}
现在我们可以完全不用编写和重复(当前/键/下一个/等)方法集,只需使用IteratorAggregate
. 这将其总结为一个单一的强制性方法:getIterator()
.
现在我们有一个这样的类:
class Bar implements \ArrayAccess, \IteratorAggregate
{
private $array = [];
public function getIterator()
{
return new ArrayIterator( $this->array );
}
}
$array
我们拥有对 classes属性的完整数组访问权限。我们可以设置和取消设置值,检查它们是否返回isset
,可以循环它们等等。更方便。它与上述所有八种方法完全相同,只是通过实现IteratorAggregate
。
最后一点:您可能会多做一步并实施Traversable
。这个接口非常好,因为它允许您在不明确说明实现开发人员需要使用哪一个的情况下实现其中一个Iterator
或强制实现。IteratorAggregate
它只是说明对象必须是可循环的是强制性的。
$foo = new IteratorContainerController();
$foo->addDependency( Traversable $bar );
这意味着 Dependency forIteratorContainerController()
将始终是一个Iterator
或已IteratorAggregate
实现的对象。所以有人可以简单地投入IteratorAggregate
,或者,如果他/她需要更细粒度的控制或在变量设置之前对变量进行预处理,他/她可以简单地使用Iterator
.