PHP编程之数组类

前面介绍的关于数组的排序、集合的三大操作,都是使用函数的,是面向过程的。接下来,了解一下面向对象编程相关的知识。数组类是什么意思呢?不难理解,数组类就是具体数组特性的类。
对于一个数组,可以获取和修改某个键的值,也可以进行删除、判断键是否存在。如果一个类想实现具备数组的访问特性,就需要实现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容器的介绍,先到这里。接下来讲魔术方法时,我们再来一起深入探讨。

发表评论