使用類靜態(tài)變量的實(shí)現(xiàn):
PHP5中,沒有必要自己實(shí)現(xiàn)類靜態(tài)變量,因?yàn)镻HP5直接支持類靜態(tài)變量。因此,PHP5簡化了實(shí)現(xiàn)。而且,PHP5中引用、對象不再有PHP4中的意義,但是assertReference() 處理了這種差別,如果兩個(gè)變量指向同一個(gè)對象句柄也可以通過測試。
以下是為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版本的使用靜態(tài)類變量的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類的一個(gè)有趣的效果是你可以用相同的代碼使用實(shí)例或者靜態(tài)方法。以下是證明僅僅使用靜態(tài)方法的測試用例。
代碼:
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’)); }
現(xiàn)在你已經(jīng)看到在PHP5中的靜態(tài)調(diào)用接口,下面讓我們在PHP4中實(shí)現(xiàn)相同的接口。在前面的PHP4“靜態(tài)類變量”部分,實(shí)現(xiàn)需要使用“函數(shù)靜態(tài)變量返回引用”來跟蹤。PHP4版本的靜態(tài)調(diào)用接口測試與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’)); } }
以下是符合測試要求的代碼實(shí)現(xiàn)。
代碼:
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; } }
這個(gè)實(shí)現(xiàn)方法的重點(diǎn)是getRegistry()方法返回一個(gè)對靜態(tài)數(shù)組的引用。
$store =& RegistryStatic::_getRegistry();這一行,在隨后的函數(shù)中把變量$store通過引用賦給靜態(tài)數(shù)組,允許所有的函數(shù)可以靜態(tài)訪問數(shù)組,允許所有的方法可以被靜態(tài)調(diào)用。
也可以不使用PHP4“靜態(tài)類變量跟蹤”達(dá)到相同的效果:將原先的基于單件模式的Registry類與一個(gè)包裝類結(jié)合以達(dá)到允許靜態(tài)調(diào)用。這個(gè)類與testRegistryStatic()有相同的測試代碼,但是他的實(shí)現(xiàn)如下所示:
代碼:
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
責(zé)任編輯:bluehearts
上一頁 php設(shè)計(jì)模式介紹之注冊模式 [5] 下一頁 php設(shè)計(jì)模式介紹之注冊模式 [7]
◎進(jìn)入論壇網(wǎng)絡(luò)編程版塊參加討論
|