クラスは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 )
}
$var[$offset]
これにより、このクラスのインスタンスで配列アクセスを使用できます。$container
以下は、配列を使用してプロパティを保持する、このようなクラスの標準実装です。
class Strategie implements ArrayAccess {
private $container = array();
public function __construct() {
$this->container = array(
"something" => 1,
);
}
public function offsetSet($offset, $value) {
if (is_null($offset)) {
$this->container[] = $value;
} else {
$this->container[$offset] = $value;
}
}
public function offsetExists($offset) {
return isset($this->container[$offset]);
}
public function offsetUnset($offset) {
unset($this->container[$offset]);
}
public function offsetGet($offset) {
return isset($this->container[$offset]) ? $this->container[$offset] : null;
}
}
の実際の実装Strategie
や派生元のクラスを見ないと、実際に何をしているのかを知るのは困難です。
ただし、これを使用すると、たとえば存在しないオフセットにアクセスする場合など、クラスの動作を制御できます。次のように置き換えるoffsetGet($offset)
とします。
public function offsetGet($offset) {
if (isset($this->container[$offset])) {
return $this->container[$offset];
} else {
Logger.log('Tried to access: ' + $offset);
return $this->default;
}
}
これで、存在しないオフセットにアクセスしようとすると、デフォルト (例: $this->default
) が返され、たとえばエラーがログに記録されます。
__set()
マジック メソッド、__get()
、__isset()
およびを使用して、同様の動作を実現できることに注意してください__unset()
。先ほどリストした魔法のメソッドとの違いはArrayAccess
、プロパティにアクセスするの$obj->property
ではなく、$obj[offset]