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