実装の利点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 )
}
これで、を使用するだけで、その(current / key / next / etc)一連のメソッドの記述と繰り返しを完全に省くことができますIteratorAggregate
。これはそれを単一の必須のメソッドに合計します:getIterator()
。
これで、次のような結果のクラスが作成されます。
class Bar implements \ArrayAccess, \IteratorAggregate
{
private $array = [];
public function getIterator()
{
return new ArrayIterator( $this->array );
}
}
$array
そして、classesプロパティへの完全な配列アクセスがあります。値を設定および設定解除したり、値が返されるかどうかを確認isset
したり、ループしたりすることができます。はるかに便利です。そして、を実装するだけで、上記の8つのメソッドすべてとまったく同じことをIteratorAggregate
実行します。
最後の注意:おそらくもう1つのステップを実行し、同様に実装Traversable
します。このインターフェイスは、実装開発者がどちらを使用する必要があるかを明示的に指定せずに、実装Iterator
または必須のいずれかを作成できるため、非常に便利です。IteratorAggregate
オブジェクトがループ可能でなければならないことが必須であることを説明しているだけです。
$foo = new IteratorContainerController();
$foo->addDependency( Traversable $bar );
これは、の依存関係IteratorContainerController()
が常にIterator
またはIteratorAggregate
実装されたオブジェクトのいずれかになることを意味します。したがって、誰かが単純に入力するIteratorAggregate
か、よりきめ細かい制御が必要な場合、または変数が設定される前に変数の前処理を行う場合は、単純にを使用できますIterator
。