PHP中把对象当数组使用: ArrayAccess的实现
< 返回列表时间: 2020-06-07来源:OSCHINA
在PHP的预定义接口和方法中, 有一个ArrayAccess(数组式访问)接口。
定义: 像访问数组一样访问对象的能力的接口 interface ArrayAccess { public function offsetExists ( mixed $offset ) : bool public function offsetGet ( mixed $offset ) : mixed public function offsetSet ( mixed $offset , mixed $value ) : void public function offsetUnset ( mixed $offset ) : void }
举一个简单的例子, 用Foo类去实现该接口中的4个方法: class Foo implements ArrayAccess{ public function offsetExists($offset){//isset判断时调用 echo "这里是 offsetExists() 方法 你输入的参数是 {$offset}".PHP_EOL; } public function offsetGet($offset){//获取值时调用 echo "这里是 offsetGet() 方法 你输入的参数是 $offset".PHP_EOL; } public function offsetSet($offset, $value){//设置值时调用 echo "这里是 offsetSet() 方法 你输入的 {$offset}={$value}".PHP_EOL; } public function offsetUnset($offset){//unset时调用 echo "这里是 offsetUnset() 方法 你输入的参数是 {$offset}".PHP_EOL; } }
接口就是一个类的模板, 在其实现类中必须实现所有的方法,否则直接"Fatal error"。我们上面就给类Foo实现了ArrayAccess的4种方法,现在来调用下试试。 $foo = new Foo(); var_dump(isset($foo['name'])); echo $foo['name']; $foo['name'] = 'aben'; unset($foo['name'] );
运行结果是: 这里是 offsetExists() 方法 你输入的参数是 name bool(false) 这里是 offsetGet() 方法 你输入的参数是 name 这里是 offsetSet() 方法 你输入的 name=aben 这里是 offsetUnset() 方法 你输入的参数是 name
在实际的工作中,最常用到ArrayAccess的就属ORM获取数据操作了。 下面是tp5.1中数据集Collection类的代码摘要 /** * 数据集管理类 */ class Collection implements ArrayAccess, Countable, IteratorAggregate, JsonSerializable, Arrayable, Jsonable { .... // ArrayAccess public function offsetExists($offset) { return array_key_exists($offset, $this->items); } public function offsetGet($offset) { return $this->items[$offset]; } public function offsetSet($offset, $value) { if (is_null($offset)) { $this->items[] = $value; } else { $this->items[$offset] = $value; } } public function offsetUnset($offset) { unset($this->items[$offset]); } ... }
该类中实现了ArrayAccess的4种操作, 以及Countable实现数组的count方法。
热门排行