測(cè)試又通過(guò)了!現(xiàn)在我們想最終特性進(jìn)發(fā):給定一個(gè)屬性key,注冊(cè)模式類(lèi)的get()方法將返回一個(gè)對(duì)特定對(duì)象的引用。一下為符合這一要求的測(cè)試用例。
代碼:
class RegistryPHP4TestCase extends UnitTestCase {function testRegistryIsSingleton() { /*...*/ } function testEmptyRegistryKeyIsInvalid() { /*...*/ } function testEmptyRegistryKeyReturnsNull() { /*...*/ } function testSetRegistryKeyBecomesValid() { /*...*/ } function testSetRegistryValueIsReference() {$reg =& Registry::getInstance();$test_value = 'something'; $reg->set('key', $test_value); $this->assertReference($test_value, $reg->get('key')); //another way to test the reference $test_value .= ' else'; $this->assertEquual('something else',$reg->get('key')); } }
以下為注冊(cè)模式類(lèi)的完整實(shí)現(xiàn)代碼。
代碼:
class Registry {var $_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;} function &getInstance() {static $instance = array(); if (!$instance) $instance[0] =& new Registry; return $instance[0]; } }
“注冊(cè)模式”的get()方法會(huì)返回一個(gè)對(duì)象引用。類(lèi)似的,set()方法的$obj參數(shù)要求得到一個(gè)對(duì)象引用并被賦值$this->_store[$key].。get()和set()方法的聯(lián)合恰當(dāng)使用能夠滿足assertReference()測(cè)試。
作者注: “注冊(cè)模式”的get()Registry::get()方法的代碼應(yīng)該寫(xiě)成@$this->_store[$key;]的形式,但是最好避免使用錯(cuò)誤抑制符,使用錯(cuò)誤抑制符的代碼會(huì)變的摸棱兩可,你需要花費(fèi)額外的時(shí)間去了解你是否會(huì)再次訪問(wèn)這段代碼。array_key_exists()方法指出了應(yīng)該避免的錯(cuò)誤。
PHP5中,對(duì)象句柄(引用)帶來(lái)了革命性的變化——你可以從對(duì)象引用的困境中解脫出來(lái)。事實(shí)上PHP5中注冊(cè)模式的實(shí)現(xiàn)變的簡(jiǎn)單多了。因?yàn)槟阍僖膊挥脫?dān)心因?yàn)闆](méi)有通過(guò)引用傳遞對(duì)象而引起致命錯(cuò)誤的情況下使用聯(lián)合數(shù)組。在PHP5中,你甚至能在注冊(cè)模式中混和使用對(duì)象和變量。
出處:phpchina
責(zé)任編輯:bluehearts
上一頁(yè) php設(shè)計(jì)模式介紹之注冊(cè)模式 [2] 下一頁(yè) php設(shè)計(jì)模式介紹之注冊(cè)模式 [4]
◎進(jìn)入論壇網(wǎng)絡(luò)編程版塊參加討論
|