`
qzriso
  • 浏览: 242965 次
  • 性别: Icon_minigender_1
  • 来自: ph
社区版块
存档分类
最新评论

ArrayAccess接口介绍

    博客分类:
  • php
阅读更多
在 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. 《面向对象分析与设计》
分享到:
评论

相关推荐

    PHP 的ArrayAccess接口 像数组一样来访问你的PHP对象

    ArrayAccess 接口允许对象像数组一样进行索引操作,即可以使用方括号语法来读取和设置对象中的元素。 ArrayAccess 接口包含四个方法,这些方法必须在实现它的类中被定义: 1. `offsetExists($index)` - 判断索引...

    php SPL IteratorAggregate_ArrayAccess_Countable_ArrayObject接口简单用法

    本篇文章将详细探讨`IteratorAggregate`, `ArrayAccess`, `Countable` 和 `ArrayObject` 这四个与数组操作相关的SPL接口,以及它们的简单用法。 首先,`IteratorAggregate` 是一个接口,用于让类可以自定义其迭代...

    PHP数组式访问接口ArrayAccess用法分析

    例如,当需要创建一个自定义的数据结构,但它需要能够以数组的方式被访问时,实现ArrayAccess接口就显得非常有用。 在提供的示例代码中,有一个名为ArrayAndObjectAccess的类,这个类实现了ArrayAccess接口。在这个...

    PHP中预定义的6种接口介绍

    ArrayAccess接口提供了一种方式,使对象可以像数组一样被访问。接口定义了4个方法来实现这一功能: - `offsetExists($offset)`:检查给定的偏移量是否存在于对象中。 - `offsetGet($offset)`:返回给定偏移量对应...

    PHP容器类的两种实现方式示例

    PHP容器类的实现可以有多种方式,本文主要介绍通过魔术方法和ArrayAccess接口实现容器类的两种不同方式,并通过实例演示了如何定义和使用容器类。 首先,我们来看通过魔术方法实现容器类的方式。魔术方法是PHP中...

    PHP之预定义接口详解

    ArrayAccess接口允许对象像数组一样操作。它包含四个抽象方法:`offsetExists()`, `offsetGet()`, `offsetSet()`, 和 `offsetUnset()`。这些方法分别对应于PHP数组中的`isset()`, `$array[key]`, `$array[key] = ...

    PHP的SPL标准库的用法介绍.pdf

    例如,`ArrayAccess`接口允许一个对象像数组一样被访问,`Countable`接口提供了`count()`方法来获取对象元素的数量。 5. **异常处理(Exceptions)** - SPL提供了标准的异常处理类,如`Exception`和它的子类,如`...

    dependency-injection-container:PHP 中的一个小的依赖注入容器模式

    依赖注入容器 这个依赖注入容器管理两种数据... 上述调用等效于以下代码,因为Container实现了ArrayAccess接口: $ container [ 'connection' ] = function () { return new Connection ( 'database_name' , 'root'

    php-dot-notation:PHP点表示法访问数组

    Dot实现了PHP的ArrayAccess接口,并且Dot对象也可以与具有附加点标记的普通数组相同地使用。例子使用Dot,您可以更改以下常规数组语法: $ array [ 'info' ][ 'home' ][ 'address' ] = 'Kings Square' ;echo $ ...

    tree:php二叉树实现

    文档完善 (注:Node、Tree 均实现了ArrayAccess接口) 关于Node实例类的结构如下: 关于Tree实例类的结构如下: $root 包含当前树的根节点 $current 包含当前树的指针(目前指针在于tree()、leaf()、end()、closest...

    php中创建和调用webservice接口示例

    同时,通过实现PHP的`ArrayAccess`接口,可以使对象像数组一样被访问,增加代码的灵活性。 总的来说,理解并熟练掌握PHP创建和调用Web Service接口的能力,对于开发跨平台、跨系统的应用程序至关重要。通过实例代码...

    array-abstraction:实现 ArrayAccessIteratorCountable 接口的本机数组和对象的抽象

    实现 ArrayAccess/Iterator/Countable 接口的内置数组和对象的抽象。 这个库旨在抽象出 PHP 内置数组和不同接口对象之间的差异,可以实现以挂钩到数组语法。 PHP 有许多用于数组的内置函数,但它们只适用于内置...

    restful:轻松创建 RESTful API 响应

    轻松创建 RESTful API 响应 ... 您提供数据,包将处理输出格式和状态...要返回单个实体,您可以调用Restful外观上的entity方法并提供实现ArrayAccess接口的任何内容。 $response = Restful::entity([ 'name' => 'Dext

    phpmig:适用于php的简单迁移系统

    Phpmig需要一个引导程序文件,该文件必须返回一个使用几个预定义键实现ArrayAccess接口的对象。 我们建议返回一个简单的依赖项注入容器的实例。 这也是将自己的服务暴露给可以访问容器的迁移本身(例如的理想机会。...

    Database Access Through Arrays for PHP5-开源

    ArrayAccess接口定义了四个方法:offsetExists(), offsetGet(), offsetSet(), 和 offsetUnset(),分别对应于PHP数组的isset(), $array[], $array[] = ..., unset($array[])操作。通过这些接口,"DATA"库使得数据库...

Global site tag (gtag.js) - Google Analytics