前面介绍的关于数组的排序、集合的三大操作,都是使用函数的,是面向过程的。接下来,了解一下面向对象编程相关的知识。数组类是什么意思呢?不难理解,数组类就是具体数组特性的类。
对于一个数组,可以获取和修改某个键的值,也可以进行删除、判断键是否存在。如果一个类想实现具备数组的访问特性,就需要实现ArrayAccess(数组式访问)接口,并且需要实现以下四个方法:
- ArrayAccess::offsetExists — 检查一个偏移位置是否存在
- ArrayAccess::offsetGet — 获取一个偏移位置的值
- ArrayAccess::offsetSet — 设置一个偏移位置的值
- ArrayAccess::offsetUnset — 复位一个偏移位置的值
结合下面示例,可以看更好地理解这四个方法的用处。
$arr = array('dogstar' => 95, 'aevit' => 98); // 检查一个偏移位置是否存在 var_dump(isset($arr['dogstar'])); // 获取一个偏移位置的值 var_dump($arr['dogstar']); // 设置一个偏移位置的值 $arr['dogstar'] = 96; // 复位一个偏移位置的值 unset($arr['dogstar']);
那什么时候会用到数组类呢?这里先简单抛个砖,后面会继续深入讨论。在PHP开源框架或开源类库里,会用到这个ArrayAccess接口实现一些高级的功能操作。以流行的Phalcon框架为例,它的DI容器,以及依赖注入是设计得非常巧妙且强大的。其中就可以通过数组的方式来访问DI容器。例如:
<?php $di = new Phalcon\DI(); // 通过数组方式设置 $di["request"] = new \Phalcon\Http\Request(); // 通过数组方式读取 var_dump($di["request"]);
PhalApi开源接口框架受此启发,也引入了DI依赖注入,同时也实现了ArrayAccess接口。在PhalApi的PHP源代码里,我们可以找到对应的实现代码。
<?php namespace PhalApi; class DependenceInjection implements ArrayAccess { // …… /** ------------------ ArrayAccess(数组式访问)接口 ------------------ **/ public function offsetSet($offset, $value) { $this->set($offset, $value); } public function offsetGet($offset) { return $this->get($offset, NULL); } public function offsetUnset($offset) { unset($this->data[$offset]); } public function offsetExists($offset) { return isset($this->data[$offset]); } }
当开发工程师需要使用DI容器时,就可以像Phalcon那样,使用数组的方式来操作。例如和前面类似的实现:
<?php // 通过快速函数来获取 $di = PhalApi\DI(); // 通过数组方式设置 $di["request"] = new \PhalApi\Request(); // 通过数组方式读取 var_dump($di["request"]);
这里关于数组的访问接口,以及DI容器的介绍,先到这里。接下来讲魔术方法时,我们再来一起深入探讨。