文档章节

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

昨日今日明日
 昨日今日明日
发布于 2013/04/18 10:17
字数 623
阅读 63
收藏 0

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

<!-- lang: php -->
    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的世界里,最基本的工作就是封装,封装可以有效的将变化置于内部。当配置信息发生改变时,应用程序中代码无需任何改变,所有处理操作将在类的方法中更改,可能要做的就是更改一个策略吧。

© 著作权归作者所有

共有 人打赏支持
昨日今日明日
粉丝 3
博文 17
码字总数 7394
作品 0
程序员
私信 提问
PHP SPL笔记

PHP SPL笔记 作者: 阮一峰 日期: 2008年7月 8日 这几天,我在学习PHP语言中的SPL。 这个东西应该属于PHP中的高级内容,看上去很复杂,但是非常有用,所以我做了长篇笔记。不然记不住,以后...

晨曦之光
2012/03/09
495
1
PHP实现Collection数据集类及其原理

PHP 语言最重要的特性之一便是数组了(特别是关联数组)。 PHP 为此也提供不少的函数和类接口方便于数组操作,但没有一个集大成的类专门用来操作数组。 如果数组操作不多的话,个别函数用起来...

技术小胖子
2017/11/08
0
0
php 的arrayaccess抽象类的使用

php中有一个arrayaccess抽象类其中有四个抽象方法 offsetSet($offset, $value) offsetGet($offset) offsetExists($offset) offsetUnset($offset) 实现arrayaccess后可对对象进行数组式的操作...

hopevow
2016/10/20
0
0
PHP预定义接口:ArrayAccess

简介 提供像访问数组一样访问对象的能力的接口。 接口摘要 { } //实例化对象$zhangsan = new Obj(); //赋值$zhangsan['name'] = '张三';//调用Obj::offsetSet方法 //输出echo $zhangsan['nam......

hgditren
2018/06/26
0
0
洪柏利/PHP_SPL

SPL SPL的常用数据结构以及常用迭代器等,主要是参考慕课网的《站在巨人的肩膀上写代码-SPL》教程 1-1 概述 1. 什么是SPL SPL是Standard PHP Library的缩写 官方定义:The Standard PHP Libr...

洪柏利
2018/01/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Httpd 整合 Tomcat 步骤

环境:Tomcat8 + Httpd2.4 工作原理:借助于Tomcat的AJP连接器实现Apache与Tomcat的通信 配置步骤: 1. 配置httpd.conf 新增: Include conf/extra/mod_jk.conf 修改:添加 index.jsp <IfM...

ZeroneLove
昨天
1
0
Docker笔记3——容器命令(未写完,明天整理接着写)

未写完,明天整理接着写 新建并启动容器 docker run docker run [OPTIONS] IMAGE [COMMEND] [ARG...] OPTIONS: --name=[容器新名字] :为容器指定一个名称 -d:后台运行容器,并返回容器ID,...

HappyBKs
昨天
1
0
2018个人年终总结

感谢领导的信任和指导,新的一年获得了很多成长和提高,改掉了很多不好的习惯。 在这一年里,我在领导的帮助下,主要完成了以下功能: 1、完成上海银行版本投资营销相关功能的开发。 2、完成车...

万山红遍
昨天
10
0
保密工作与linux系统的发展

保密工作从性质上可以分成商业方面的保密和国家安全方面的保密。由于自己从事的是IT方面的工作,工作中必然会接触涉及到计算机信息方面的相关文件。加上单位已近通过武器装备科研生产单位二级...

linux-tao
昨天
3
0
Spark共享变量

概述 Spark程序的大部分操作都是RDD操作,通过传入函数给RDD操作函数来计算。这些函数在不同的节点上并发执行,但每个内部的变量有不同的作用域,不能相互访问,所以有时会不太方便,Spark提...

仟昭
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部