• ArrayAccess接口介绍
    时间:2008-12-04   作者:佚名   出处:互联网

    在 PHP5 中多了一系列新接口。在 HaoHappy 翻译的系列文章中 你可以了解到他们的应用。同时这些接口和一些实现的 Class 被归为 Standard PHP Library(SPL)。在 PHP5 中加入了很多特性,使类的重载 (Overloading) 得到进一步的加强。ArrayAccess 的作用是使你的 Class 看起来像一个数组 (PHP的数组)。这点和 C# 的 Index 特性很相似。

    下面是 ArrayAccess 的定义:


    interface ArrayAccess
    boolean offsetExists($index)
    mixed offsetGet($index)
    void offsetSet($index, $newvalue)
    void offsetUnset($index)

    由于PHP的数组的强大,很多人在写 PHP 应用的时候经常将配置信息保存在一个数组里。于是可能在代码中到处都是 global。我们换种方式?



    如以下代码:



    //Configuration Class 
    class Configuration implements ArrayAccess 
    { 
    
       static private $config; 
    
       private $configarray; 
    
       private function __construct() 
       { 
           // init 
           $this->configarray = array("Binzy"=>"Male", "Jasmin"=>"Female"); 
       } 
    
       public static function instance() 
       { 
           // 
           if (self::$config == null) 
           { 
               self::$config = new Configuration(); 
           } 
    
           return self::$config; 
       } 
    
       function offsetExists($index) 
       { 
           return isset($this->configarray[$index]); 
       } 
    
       function offsetGet($index) { 
           return $this->configarray[$index]; 
       } 
    
       function offsetSet($index, $newvalue) { 
           $this->configarray[$index] = $newvalue; 
       } 
    
       function offsetUnset($index) { 
           unset($this->configarray[$index]); 
       } 
    } 
    
    $config = Configuration::instance(); 
    print $config["Binzy"];
    


    正如你所预料的,程序的输出是"Male"。


    如果我们做下面那样的动作:



    $config = Configuration::instance(); 
    print $config["Binzy"]; 
    $config['Jasmin'] = "Binzy's Lover"; 
    // config 2 
    $config2 = Configuration::instance(); 
    print $config2['Jasmin'];
    


    是的,也正如预料的,输出的将是Binzy's Lover。


    也许你会问,这个和使用数组有什么区别呢?目的是没有区别的,但最大的区别在于封装。OO 的最基本的工作就是封装,而封装能有效将变化置于内部。也就是说,当配置信息不再保存在一个 PHP 数组中的时候,是的,应用代码无需任何改变。可能要做的,仅仅是为配置方案添加一个新的策略(Strategy)。:



    ArrayAccess 在进一步完善中,因为现在是没有办法 count 的,虽然大多数情况并不影响我们的使用。



    参考:

    1. 《PHP5 Power Programming》


    2. 《设计模式》


    3. 《面向对象分析与设计》

    网友留言/评论

    我要留言/评论