首页  韩国资源  酷站加油  我的展厅  设计名站  古典元素  推荐下载  设计欣赏  每周专访  招募精英  人才专区  网页教程  平面设计  编程开发  设计竞赛
当前位置:首页 > 编程开发 > PHP教程 > 正文
Google
php设计模式介绍之注册模式
来源:phpchina 作者:HRTSEA 2008年07月07日 10:48 网友评论:0条 点击:

《PHP设计模式介绍》第五章 注册模式

我们通常认为避免使用全局变量是一种好的选择,因此,对象经常被作为参数从一段代码传递到另一段。但是传递实例的一个问题就是对象有时候不知道将要传递给谁——?经过一个函数后才被传递到真正需要这个对象的函数。

为了编写,阅读,修改代码的方便,最好能够减少不同对象的数量,并且能够将大量广泛使用的对象统一表示为一个单一,常用的对象。

问题

你如何通过单一的全局的对象来获取对其它对象的引用?

解决方案

“注册模式”就像“对象的电话簿”——储存并且能够取回对对象引用的登记簿。(注:PHP中的“联合数组”也起到了类似“电话簿”的功能。事实上,“注册模式”就是围绕PHP中强大的数组完成的。)“注册模式”的一些特性经常被包含在“单一模式”中(参见第四章),使得“注册模式”成为你整个应用信息的决定性来源。

注释:“注册模式”类主要参考了Martin Fowlerdescribes用java语言实现的Patterns of Enterprise Application Architecture(企业应用程序体系结构模型)。Marcus Baker谢了一篇详细的PHP中应用“注册模式”的文章。该文章可在PHPPatterns.com的站点获的(http://www.PHPpatterns.com/index.PHP/article/articleview/75/1/1/)。Baker也涉及了一些测试considerations,示范了测试驱动的开发方法。

样本代码

正如Martin Flower在他的“注册模式”一文中提及的样本代码所示,你可以用各种方法,提供各种接口实现“注册模式”。让我们仔细探究这种想法,并建立PHP4中的“注册模式”的一些不同实现。

让我们以编写能储存并恢复对象实例并能对“注册模式”提供全局访问的代码开始。这个类的实例变量能够缓存对象,并且“注册模式”本身是一个“单一模式”。像以前一样,测试决定需求。我们的第一个测试要确定“注册模式”是一个“单件模式”类。

// PHP4
class RegistryPHP4TestCase extends UnitTestCase {
function testRegistryIsSingleton() {
$this->assertIsA($reg =& Registry::getInstance(), ‘Registry’);
$this->assertReference($reg, Registry::getInstance());
}
}

这里,要把你在以前几章“单件模式”中学到的知识用上,你应该能够很快写出能够通过该测试的类。以下是一个满足测试要求的“注册模式”类(ignoring the code required to enforce no direct object creation):

class Registry {
function &getInstance() {
static $instance = array();
if (!$instance) $instance[0] =& new Registry;
return $instance[0];
}
}

一个简单的静态数组就足够记录这个单一实例了。

接下来,让我们转到“注册模式”独特的特性上面。一个“注册模式”应该提供get() 和set()方法来存储和取得对象(用一些属性key)而且也应该提供一个isValid()方法来确定一个给定的属性是否已经设置。

这三个方法的一个简单实现在接下来讨论。这里是两个isValid():方法的测试方法。

代码:

class RegistryPHP4TestCase extends UnitTestCase
{function testRegistryIsSingleton() { /*...*/ }
function testEmptyRegistryKeyIsInvalid()
{$reg =& Registry::getInstance();
$this->assertFalse($reg->isValid('key'));
}
function testEmptyRegistryKeyReturnsNull()
{$reg =& Registry::getInstance();
$this->assertNull($reg->get('key'));
}
}

作者注:assertFalse()
assertFalse()仅仅是assertTrue()的反面,如果第一个参数预期是PHP中的布尔值false,测试通过。

首页 上一页 [1] [2] [3] [4] [5] [6] [7] 下一页 尾页
上一篇:php设计模式介绍之伪对象模式   下一篇:php设计模式介绍之单件模式
收藏此页】【打印】【关闭
 相关文章  我要点评
·Apache与PHP的整合过程
·php设计模式介绍之伪对象模式
·php设计模式介绍之单件模式
·PHP程序61条面向对象分析设计的原则
·PHP5程序中新增加日期(date)函数的常量
·PHP程序开发中的中文编码问题
·正确理解PHP程序错误信息的表示含义
·在Web开发领域编程语言PHP优势在哪

免责声明:本站刊载此文不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。对本文有任何异议,请联络:68design#163.com
转载要求:作者及来源信息必需保留。转载之图片、文件,链接请不要盗链到本站,且不准打上各自站点的水印。



关于我们 | 在线反馈 | 广告报价 | 友情链接 | 联系我们 | 免责声明 | 在线投稿 | 网站地图
Copyright © 2003-2007 68design.net, All Rights Reserve 【找网页设计师,当然上网页设计师联盟】