有一个对象,不过希望能用数组的语法来读写数据,可以使用 实现SPL的ArrayAccess接口来解决。
使用场景:加载配置文件类。larvel框架加载配置文件就这利用数组来操作对象。
数组式访问Object ,必须实现下面4个方法
/*
* offsetExists (指定一个元素是否已定义)
* offsetGet (获取一个元素的值)
* offsetSet (将元素设置为一个新值)
* offsetUnset (删除一个元素及值)
*/
1 class FakeArray implements ArrayAccess { 2 3 private $elements; 4 5 public function __consturct(){ 6 //初始化一个新数组 7 $this->elements = []; 8 } 9 10 //isset 时候触发 11 public function offsetExists($offset) 12 { 13 return isset($this->elements[$offset]); 14 } 15 16 //获取一个元素时触发 17 public function offsetGet($offset) 18 { 19 return $this->elements[$offset]; 20 } 21 22 //设置一个元素时触发 23 public function offsetSet($offset, $value) 24 { 25 return $this->elements[$offset] = $value; 26 } 27 28 //unset时触发 29 public function offsetUnset($offset) 30 { 31 unset($this->elements[$offset]); 32 } 33 } 34 35 $arr = new FakeArray(); 36 37 $arr['animal'] = 'rabbit'; 38 print_r($arr); 39 40 if (isset($arr['animal']) && $arr['animal']== 'rabbit') 41 unset($arr['animal']);
从上面代码可以看到:
每一个操作会调用一个方法
/*
* $arr['animal'] = 'rabbit' 触发offsetSet
* isset($arr['animal']) 触发offsetExists
* $arr['animal'] == 'rabbit' 触发offsetGet
* unset($arr['animal']) 触发offsetUnset
*/