Maison >php教程 >php手册 >ArrayAccess接口介绍

ArrayAccess接口介绍

WBOY
WBOYoriginal
2016-05-25 16:50:141592parcourir

在 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,我们换种方式?

如以下代码:

<?php
//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[&#39;Jasmin&#39;] = "Binzy&#39;s Lover"; 
// config 2 
$config2 = Configuration::instance(); 
print $config2[&#39;Jasmin&#39;];

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

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

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn