使用类静态变量的实现:
PHP5中,没有必要自己实现类静态变量,因为PHP5直接支持类静态变量。因此,PHP5简化了实现。而且,PHP5中引用、对象不再有PHP4中的意义,但是assertReference() 处理了这种差别,如果两个变量指向同一个对象句柄也可以通过测试。
以下是为PHP5改写的类似的Registry测试用例。
代码:
// PHP5 class RegistryMonoStatePHP5TestCase extends UnitTestCase { function testRegistryMonoState() { $this->assertCopy( $reg = new RegistryMonoState ,$reg2 = new RegistryMonoState); $this->assertFalse($reg->isValid(‘key’)); $this->assertNull($reg->get(‘key’)); $test_value = new TestObj; $reg->set(‘key’, $test_value); $this->assertReference($test_value, $reg2->get(‘key’)); } }
以下是PHP5版本的使用静态类变量的Registry类。
代码:
class RegistryMonoState { protected static $store = array();
function isValid($key) { return array_key_exists($key, RegistryMonoState::$store); }
function get($key) { if (array_key_exists($key, RegistryMonoState::$store)) return RegistryMonoState::$store[$key]; }
function set($key, $obj) { RegistryMonoState::$store[$key] = $obj; } }
PHP5中用这种方式编码Registry类的一个有趣的效果是你可以用相同的代码使用实例或者静态方法。以下是证明仅仅使用静态方法的测试用例。
代码:
class RegistryMonoStatePHP5TestCase extends UnitTestCase { function testRegistryMonoState() { /*...*/ } function testRegistryMonoStateStaticCalls() { $this->assertFalse(RegistryMonoState::isValid(‘key’)); $this->assertNull(RegistryMonoState::get(‘key’)); $test_value = new TestObj; RegistryMonoState::set(‘key’, $test_value); $this->assertIdentical($test_value, RegistryMonoState::get(‘key’)); }
现在你已经看到在PHP5中的静态调用接口,下面让我们在PHP4中实现相同的接口。在前面的PHP4“静态类变量”部分,实现需要使用“函数静态变量返回引用”来跟踪。PHP4版本的静态调用接口测试与PHP5版本的测试类似。
代码:
// PHP4 class RegistryStaticPHP4TestCase extends UnitTestCase { function testRegistryStatic() { $this->assertFalse(RegistryStatic::isValid(‘key’)); $this->assertNull(RegistryStatic::get(‘key’)); $test_value = ‘something’; RegistryStatic::set(‘key’, $test_value); $this->assertReference($test_value, RegistryStatic::get(‘key’)); } }
以下是符合测试要求的代码实现。
代码:
class RegistryStatic { function &_getRegistry() { static $store = array(); return $store; } function isValid($key) { $store =& RegistryStatic::_getRegistry(); return array_key_exists($key, $store); } function &get($key) { $store =& RegistryStatic::_getRegistry(); if (array_key_exists($key, $store)) return $store[$key]; } function set($key, &$obj) { $store =& RegistryStatic::_getRegistry(); $store[$key] =& $obj; } }
这个实现方法的重点是getRegistry()方法返回一个对静态数组的引用。
$store =& RegistryStatic::_getRegistry();这一行,在随后的函数中把变量$store通过引用赋给静态数组,允许所有的函数可以静态访问数组,允许所有的方法可以被静态调用。
也可以不使用PHP4“静态类变量跟踪”达到相同的效果:将原先的基于单件模式的Registry类与一个包装类结合以达到允许静态调用。这个类与testRegistryStatic()有相同的测试代码,但是他的实现如下所示:
代码:
class RegistryStatic { function isValid($key) { $reg =& Registry::getInstance(); return $reg->isValid($key); } function &get($key) { $reg =& Registry::getInstance(); return $reg->get($key); } function set($key, &$obj) { $reg =& Registry::getInstance(); $reg->set($key, $obj); } }
出处:phpchina
责任编辑:bluehearts
上一页 php设计模式介绍之注册模式 [5] 下一页 php设计模式介绍之注册模式 [7]
◎进入论坛网络编程版块参加讨论
|