在 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. 《面向对象分析与设计》
分享到:
相关推荐
ArrayAccess 接口允许对象像数组一样进行索引操作,即可以使用方括号语法来读取和设置对象中的元素。 ArrayAccess 接口包含四个方法,这些方法必须在实现它的类中被定义: 1. `offsetExists($index)` - 判断索引...
本篇文章将详细探讨`IteratorAggregate`, `ArrayAccess`, `Countable` 和 `ArrayObject` 这四个与数组操作相关的SPL接口,以及它们的简单用法。 首先,`IteratorAggregate` 是一个接口,用于让类可以自定义其迭代...
例如,当需要创建一个自定义的数据结构,但它需要能够以数组的方式被访问时,实现ArrayAccess接口就显得非常有用。 在提供的示例代码中,有一个名为ArrayAndObjectAccess的类,这个类实现了ArrayAccess接口。在这个...
ArrayAccess接口提供了一种方式,使对象可以像数组一样被访问。接口定义了4个方法来实现这一功能: - `offsetExists($offset)`:检查给定的偏移量是否存在于对象中。 - `offsetGet($offset)`:返回给定偏移量对应...
PHP容器类的实现可以有多种方式,本文主要介绍通过魔术方法和ArrayAccess接口实现容器类的两种不同方式,并通过实例演示了如何定义和使用容器类。 首先,我们来看通过魔术方法实现容器类的方式。魔术方法是PHP中...
ArrayAccess接口允许对象像数组一样操作。它包含四个抽象方法:`offsetExists()`, `offsetGet()`, `offsetSet()`, 和 `offsetUnset()`。这些方法分别对应于PHP数组中的`isset()`, `$array[key]`, `$array[key] = ...
例如,`ArrayAccess`接口允许一个对象像数组一样被访问,`Countable`接口提供了`count()`方法来获取对象元素的数量。 5. **异常处理(Exceptions)** - SPL提供了标准的异常处理类,如`Exception`和它的子类,如`...
依赖注入容器 这个依赖注入容器管理两种数据... 上述调用等效于以下代码,因为Container实现了ArrayAccess接口: $ container [ 'connection' ] = function () { return new Connection ( 'database_name' , 'root'
Dot实现了PHP的ArrayAccess接口,并且Dot对象也可以与具有附加点标记的普通数组相同地使用。例子使用Dot,您可以更改以下常规数组语法: $ array [ 'info' ][ 'home' ][ 'address' ] = 'Kings Square' ;echo $ ...
文档完善 (注:Node、Tree 均实现了ArrayAccess接口) 关于Node实例类的结构如下: 关于Tree实例类的结构如下: $root 包含当前树的根节点 $current 包含当前树的指针(目前指针在于tree()、leaf()、end()、closest...
同时,通过实现PHP的`ArrayAccess`接口,可以使对象像数组一样被访问,增加代码的灵活性。 总的来说,理解并熟练掌握PHP创建和调用Web Service接口的能力,对于开发跨平台、跨系统的应用程序至关重要。通过实例代码...
实现 ArrayAccess/Iterator/Countable 接口的内置数组和对象的抽象。 这个库旨在抽象出 PHP 内置数组和不同接口对象之间的差异,可以实现以挂钩到数组语法。 PHP 有许多用于数组的内置函数,但它们只适用于内置...
轻松创建 RESTful API 响应 ... 您提供数据,包将处理输出格式和状态...要返回单个实体,您可以调用Restful外观上的entity方法并提供实现ArrayAccess接口的任何内容。 $response = Restful::entity([ 'name' => 'Dext
Phpmig需要一个引导程序文件,该文件必须返回一个使用几个预定义键实现ArrayAccess接口的对象。 我们建议返回一个简单的依赖项注入容器的实例。 这也是将自己的服务暴露给可以访问容器的迁移本身(例如的理想机会。...
ArrayAccess接口定义了四个方法:offsetExists(), offsetGet(), offsetSet(), 和 offsetUnset(),分别对应于PHP数组的isset(), $array[], $array[] = ..., unset($array[])操作。通过这些接口,"DATA"库使得数据库...