个实例都将访问同 一个数组。我们把这个新类叫做ReGIStryGlobal以区别于我们前面开发的类,并反映这种实现方式的特 性。
以下为反映这种思想的测试用例(它应该看起来很熟悉)。
代码:
class RegistryGlobalPHP4TestCase extends UnitTestCase {
function testRegistryGlobal() {
$reg =& new RegistryGlobal;
$this->assertFalse ($reg->isValid(''key''));
$this->assertNull($reg->get (''key''));
$test_value = ''something'';
$reg->set(''key'', $test_value);
$this->assertReference($test_value, $reg->get(''key''));
}
}
实现代码如下所示:
class RegistryGlobal {
var
php设计模式介绍之注册模式 - 凌众科技
快速业务通道
php设计模式介绍之注册模式
作者 佚名技术
来源 NET编程
浏览
发布时间 2012-05-22
|
content |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn
为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!
|
|
|
store = array();
function isValid($key) {
return array_key_exists($key, $this- >_store);
}
function &get($key) {
if (array_key_exists($key, $this- >_store))
return $this->_store[$key];
}
function set($key, &$obj) {
$this->_store[$key] =& $obj;
}
}
isValid(), get(),和 set()方法与我们前面开发的注册模式类完全相同。
下一步:我们来编写验证RegistryGlobal类 是单件模式的测试用例。
代码:
class RegistryGlobalPHP4TestCase extends UnitTestCase {
function testRegistryGlobal() { /*...*/ }
function testRegistryGlobalIsMonoState() {
$reg =& new RegistryGlobal;
$reg2 =& new RegistryGlobal;
$this->assertCopy($reg, $reg2);
$test_value = ''something'';
$reg->set(''test'', $test_value);
$this- >assertReference(
$reg->get(''test'')
,$reg2->get (''test''));
}
}
这里测试用例创建了RegistryGlobal类的两个实例 ,并确认他们不是对同一对象的引用——在一个实例内设置一个对象的属性值(value),最 后证实两个实例返回相同的对象。若测试通过RegistryGlobal类就拥有单态的行为。
代码:
define(''REGISTRY_GLOBAL_STORE'', ''__registry_global_store_key__'');
class RegistryGlobal
{var
php设计模式介绍之注册模式 - 凌众科技
快速业务通道
php设计模式介绍之注册模式
作者 佚名技术
来源 NET编程
浏览
发布时间 2012-05-22
|
content |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn
为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!
|
|
|
store;
function RegistryGlobal()
{if
(!array_key_exists(REGISTRY_GLOBAL_STORE, $GLOBALS)||!is_array($GLOBALS[REGISTRY_GLOBAL_STORE])) {$GLOBALS[REGISTRY_GLOBAL_STORE] = array();
}
$this->_store =& $GLOBALS[REGISTRY_GLOBAL_STORE];
}
function isValid($key)
{return array_key_exists($key, $this->_store);}
function &get($key)
{if (array_key_exists($key, $this->_store)) return $this ->_store[$key];}
function set($key, &$obj) {
$this->_store[$key] =& $obj;
}
}
本方法中的神奇之处在于$this->_store =& $GLOBALS [REGISTRY_GLOBAL_STORE;] 这一行,引用操作符将全局数组绑定到实例变量
php设计模式介绍之注册模式 - 凌众科技
快速业务通道
php设计模式介绍之注册模式
作者 佚名技术
来源 NET编程
浏览
发布时间 2012-05-22
|
content |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn
为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!
|
|
|
store上。这是单件模式 实现的关键所在:每次在对象中使用$this->_store变量时,作用反映到全局变量中。
但是并 不推荐基于全局变量的解决方案。如果PHP4支持这一特性的话,静态类变量会是更好的解决方案。然而 ,我们可以在代码中通过引用实现静态类变量吗?
测试与 RegistryGlobal 类的测试相似。
代码:
class RegistryMonoStatePHP4TestCase extends UnitTestCase {
function testRegistryMonoState() {
$this->assertCopy(
$reg =& new RegistryMonoState;
$reg2 =& new RegistryMonoState);
$this->assertFalse ($reg->isValid(‘key’));
$this->assertNull($reg->get (‘key’));
$test_value = ‘something’;
$reg->set (‘key’, $test_value);
$this
|