有一个对象,不过希望能用数组的语法来读写数据,可以使用 实现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
*/

  

 
posted on 2016-05-27 10:09  睡着的糖葫芦  阅读(693)  评论(0编辑  收藏  举报