SPL之ArrayAccess 使一个类拥有数组的操作

写一个类,然后继承 spl的 ArrayAccess接口,来实现将一个类拥有数组的特性,来更方便的操作。


    ArrayAccess接口定义:

    interface ArrayAccess;

boolean offsetExists($index); //一个key是否存在,类似 isset


mixed offsetGet($index); //得到一个值,当做数组读取

void offsetSet($index, $value); // 给一个下标赋值,当做数组赋值

void offsetUnset($index); //注销一个小标,类似unset


class Page implements ArrayAccess{ //继承ArrayAccess接口

    private static $_instance = NULL;

    //分页程序的默认配置

    protected $_config = array('current_page'=> array('key' => 'page'),

    'per_item_page' => 10,

    'total_item' => 0,

    );

    protected $current_page;

    protected $total_pages;
    ................


    //使用了设计模式中的单例模式

    public static function instance($config = array()){

        if(self::$_instance == NULL){

                self::$_instance = new self($config);

            }

        return self::$_instance;

    }


    function __construct($config){
            $this->setup($config);
    }

    //关于分页程序的处理,这里也可以采用private 或 protected进行封装,只允许使用 ArrayAccess 实现的数组接口方式赋值,具体操作不对外,做到过滤和维护方便的目的

    function setup($config = array()){

    ................

    //具体处理后对 类的属性赋值(或数组),或通过中间方法赋值

    }


    function offsetExists($index){

     return isset($this->$index);  //判断类的属性是否存在

    //我们也可以把数据存放在一个私有数组变量中这时就需要这样判断:

    // return array_key_exists($index, $this->_data);

    }


    function offsetGet($index){

        return isset($this->$index) ? $this->$index : NULL; //直接返回类的属性

    // 这里我设置了属性为protected 保护级别,是不对外开放的。所以我们可以在这个方法中对属    性来一次过滤

    }


    function offsetSet($index, $value){

        $this->setup(array($index, $value)); //通过setup方法,具体处理

    }


    function offsetUnset($index){

        unset($this->$index);  //注销类的属性 ,存储在数组时,unset($this->_data[$index]);

    }

}

$Pages = Page::instance(); // 类的实例化

$Pages->setup(array('per_item_page' => 10, 'total_item' => 100)); //通过setup方法初始化分页类的关键值

$Pages['per_item_page'] = 10; //采用了spl的 ArrayAccess接口后,通过数组方式初始化分页类的关键值

$Pages['total_item'] = 100;


读取数据就很方便了。直接

$current_page =  $Pages['current_page'];

$offset = $Pages['offset'];

哈,是不是像操作数组那样来操作类了,那么在这里数组与类的区别是什么呢?最大的区别就是封装。在OO的世界里,最基本的工作就是封装,封装可以有效的将变化置于内部。当配置信息发生改变时,应用程序中代码无需任何改变,所有处理操作将在类的方法中更改,可能要做的就是更改一个策略吧。

你可能感兴趣的:(spl,ArrayAccess)