»¶ÓÄú·ÃÎÊÎÒ°®IT¼¼ÊõÍø£¬½ñÌìС±àΪÄã·ÖÏíµÄ±à³Ì¼¼ÊõÊÇ£º¡¾¡¶PHPÉè¼ÆÄ£Ê½½éÉÜ¡·µÚÎåÕ ע²áģʽ¡¿£¬ÏÂÃæÊÇÏêϸµÄ·ÖÏí£¡
¡¶PHPÉè¼ÆÄ£Ê½½éÉÜ¡·µÚÎåÕ ע²áģʽ
ÎÒÃÇͨ³£ÈÏΪ±ÜÃâʹÓÃÈ«¾Ö±äÁ¿ÊÇÒ»ÖֺõÄÑ¡Ôñ,Òò´Ë£¬¶ÔÏó¾³£±»×÷Ϊ²ÎÊý´ÓÒ»¶Î´úÂë´«µÝµ½ÁíÒ»¶Î¡£µ«ÊÇ´«µÝʵÀýµÄÒ»¸öÎÊÌâ¾ÍÊǶÔÏóÓÐʱºò²»ÖªµÀ½«Òª´«µÝ¸øË——?¾¹ýÒ»¸öº¯Êýºó²Å±»´«µÝµ½ÕæÕýÐèÒªÕâ¸ö¶ÔÏóµÄº¯Êý¡£
ΪÁ˱àд£¬ÔĶÁ£¬Ð޸ĴúÂëµÄ·½±ã£¬×îºÃÄܹ»¼õÉÙ²»Í¬¶ÔÏóµÄÊýÁ¿£¬²¢ÇÒÄܹ»½«´óÁ¿¹ã·ºÊ¹ÓõĶÔÏóͳһ±íʾΪһ¸öµ¥Ò»,³£ÓõĶÔÏó¡£
ÎÊÌ⣺
ÄãÈçºÎͨ¹ýµ¥Ò»µÄÈ«¾ÖµÄ¶ÔÏóÀ´»ñÈ¡¶ÔÆäËü¶ÔÏóµÄÒýÓã¿
½â¾ö·½°¸£º
“×¢²áģʽ”¾ÍÏñ“¶ÔÏóµÄµç»°²¾”——´¢´æ²¢ÇÒÄܹ»È¡»Ø¶Ô¶ÔÏóÒýÓõĵǼDz¾¡££¨×¢£º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ÖеIJ¼¶ûÖµfalse£¬²âÊÔͨ¹ý¡£
ͨ¹ý»ùÓÚ²âÊÔÇý¶¯µÄ¿ª·¢·½Ê½£¬Äã¿ÉÒÔ±àд¾¡¿ÉÄÜÉٵĴúÂëÀ´·ûºÏÄãÏֽ׶εIJâÊÔÐèÇó£¬ÄãÒ²¿ÉÒÔÔö¼Ó²âÊÔ——Èç¹ûÄ㻹δÂú×ãÕâ¸öÀàµÄÐèÇó¡£
ÒÔÏÂΪÂú×ãǰÊö²âÊÔÒªÇóµÄ×î¼òµ¥µÄ´úÂ룺
´úÂ룺
| class Registry {function isValid() {return false;} function get() {} function &getInstance() {static $instance=array(); if (!$instance) $instance[0]=& new Registry; return $instance[0]; } } |
ȷʵ£¬isValid() ºÍ get()·½·¨µÄ´úÂëÆ¬¶Ï²¢²»ÊǷdz£ºÃ£¬µ«ÊÇËùÓеIJâÊÔͨ¹ýÁË£¡ÏÂÃæÎÒÃÇÌí¼Ó¸ü·á¸»µÄ²âÊÔÓÃÀý¡£
´úÂ룺
| class RegistryPHP4TestCase extends UnitTestCase {function testRegistryIsSingleton() { } function testEmptyRegistryKeyIsInvalid() { } function testEmptyRegistryKeyReturnsNull() { } function testSetRegistryKeyBecomesValid() {$reg=& Registry::getInstance(); $test_value='something';$reg->set('key', $test_value); $this->assertTrue($reg->isValid('key')); } } |
ΪÁËÂú×ãtestSetRegistryKeyBecomesValid()·½·¨£¬“×¢²áģʽ”Àà±ØÐëÒªÓÐ×·×Ù£¨tracking£©µÄ¹¦ÄÜ——Èç¹ûÌØ¶¨µÄÊôÐÔÓÃset()·½·¨ÉèÖÃÁË¡£ ºÜÃ÷ÏÔµÄÒ»ÖÖʵÏÖ·½Ê½ÊÇÀûÓÃPHP4ÖеÄÁªºÏÊý×é×÷ΪʵÀý±äÁ¿£¬²¢ÀûÓÃPHPµÄarray_key_exists()º¯ÊýÀ´¼ì²âÎÒÃÇÏëÒªµÄË÷ÒýÊÇ·ñ±»´´½¨ÁË¡£
ÏÂÃæÊǓע²áģʽÀà”¸ü½øÒ»²½µÄʵÏÖ¡£
´úÂ룺
| class Registry {var $_store=array(); function isValid($key) {return array_key_exists($key, $this->_store);} function set($key, $obj) {$this->_store[$key]=$obj; function get() {} function &getInstance() {static $instance=array() if (!$instance) $instance[0]=& new Registry; return $instance[0]; } } |
ͨ¹ýÔÚÉùÃ÷ʱ³õʼ»¯$_store±äÁ¿£¬¾ÍûÓÐÉèÖù¹Ô캯ÊýµÄ±ØÒªÁË¡££¨×¢£ºÔÚPHP4ÖÐûÓÐÊʵ±µÄ·ÃÎÊ¿ØÖƱê¼Ç£¬ÒÔÏ´úÂë×ñÑ˽ÓбäÁ¿ÒÔÏ»®Ïß×÷ǰ׺µÄÔ¼¶¨£©
²âÊÔÓÖͨ¹ýÁË£¡ÏÖÔÚÎÒÃÇÏë×îÖÕÌØÐÔ½ø·¢£º¸ø¶¨Ò»¸öÊôÐÔkey£¬×¢²áģʽÀàµÄget()·½·¨½«·µ»ØÒ»¸ö¶ÔÌØ¶¨¶ÔÏóµÄÒýÓá£Ò»ÏÂΪ·ûºÏÕâÒ»ÒªÇóµÄ²âÊÔÓÃÀý¡£
´úÂ룺
| 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')); } } |
ÒÔÏÂΪע²áģʽÀàµÄÍêÕûʵÏÖ´úÂë¡£
´úÂ룺
| 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]; } } |
“×¢²áģʽ”µÄget()·½·¨»á·µ»ØÒ»¸ö¶ÔÏóÒýÓá£ÀàËÆµÄ£¬set()·½·¨µÄ$obj²ÎÊýÒªÇóµÃµ½Ò»¸ö¶ÔÏóÒýÓò¢±»¸³Öµ$this->_store[$key].¡£get()ºÍset()·½·¨µÄÁªºÏÇ¡µ±Ê¹ÓÃÄܹ»Âú×ãassertReference()²âÊÔ¡£
×÷Õß×¢£º
“×¢²áģʽ”µÄget£¨£©Registry::get()·½·¨µÄ´úÂëÓ¦¸Ãд³É@$this->_store[$key;]µÄÐÎʽ£¬µ«ÊÇ×îºÃ±ÜÃâʹÓôíÎóÒÖÖÆ·û£¬Ê¹ÓôíÎóÒÖÖÆ·ûµÄ´úÂë»á±äµÄÃþÀâÁ½¿É£¬ÄãÐèÒª»¨·Ñ¶îÍâµÄʱ¼äÈ¥Á˽âÄãÊÇ·ñ»áÔٴηÃÎÊÕâ¶Î´úÂë¡£array_key_exists()·½·¨Ö¸³öÁËÓ¦¸Ã±ÜÃâµÄ´íÎó¡£
PHP5ÖУ¬¶ÔÏó¾ä±ú£¨ÒýÓã©´øÀ´Á˸ïÃüÐԵı仯——Äã¿ÉÒÔ´Ó¶ÔÏóÒýÓõÄÀ§¾³ÖнâÍѳöÀ´¡£ÊÂʵÉÏPHP5ÖÐ×¢²áģʽµÄʵÏÖ±äµÄ¼òµ¥¶àÁË¡£ÒòΪÄãÔÙÒ²²»Óõ£ÐÄÒòΪûÓÐͨ¹ýÒýÓô«µÝ¶ÔÏó¶øÒýÆðÖÂÃü´íÎóµÄÇé¿öÏÂʹÓÃÁªºÏÊý×é¡£ÔÚPHP5ÖУ¬ÄãÉõÖÁÄÜÔÚ×¢²áģʽÖлìºÍʹÓöÔÏóºÍ±äÁ¿¡£
Ò»¸öÀý×Ó£º
ÔÚʵ¼ÊÓ¦ÓÃÖГע²áģʽ”»áÊÇʲôÑù×Ó£¿ÔÚÍøÂçÓ¦ÓóÌÐò¿ª·¢ÖУ¬Í¨³£ÎÒÃÇÖ»ÓµÓÐÒ»¸öÊý¾Ý¿âÁ¬½Ó¡££¨Òò´Ë£¬¹ã·ºÊ¹ÓÓµ¥Ò»Ä£Ê½”¹ÜÀíÊý¾ÝÁ¬½Ó£©µ«ÊÇ£¬±ÈÈ磬ÓÉÓÚÀúÊ·ÒÅÁôÔÒò£ºÄãµÄÓ¦ÓõĿͻ§Êý¾Ý¿âÓëÄãµÄÔÚÏß¶©µ¥Êý¾Ý¿âÊÇ·Ö¿ªµÄ£¬ÄãµÄDBAÓÖ°ÑÄãµÄ¾É¶©µ¥×ªÒƵ½Ò»¸ö´æµµÊý¾Ý¿âÖУ¬¶øÇÒËüÓëÄãµÄ¿Í»§Êý¾Ý¿â¼°¶©µ¥£¨ÏÖÓУ¬×î½ü£©Êý¾Ý¿âÒ²ÊÇÍêÈ«¸ôÀëµÄ¡£ÄÇô£¬ÄãÔõô²ÅÄÜ·½±ãµØ¹ÜÀíÈý¸öÊý¾Ý¿âÁ¬½Ó¶ø²»Óô´½¨Èý¸öµ¥¶ÀµÄ“µ¥Ò»Ä£Ê½”ÄØ£¿´ð°²¾ÍÊÇʹÓÓע²áģʽ”¡£
´úÂ룺
| class DbConnections extends Registry {} |
×¢£ºµ±ÄãÔÚÄãµÄ´úÂëÖÐÒýÈëÉè¼ÆÄ£Ê½Ê±£¬ÄãµÄÀàÃûÓ¦¸ÃÈÔÄÜ·´Ó³ËûµÄ½ÇÉ«ºÍ¹¦ÄܶøÃ»ÓбØÒªÊ¹ÓÃģʽµÄÃû×Ö¡£Ê¹ÓÃģʽµÄÃû×Ö×¢ÊÍ´úÂë¶ÔÓëÄãµÄÏîÄ¿ÒÔÍâµÄ³ÌÐòÔ±½»Á÷·Ç³£ÓаïÖú¡£µ«ÊÇÔÚÄãµÄÏîÄ¿ÄÚ£¬ÀàµÄÃû×ÖÓ¦¸ÃÊʺÏÏîÄ¿±¾Éí¶øÇÒÄܹ»±»ÏîÄ¿³ÉÔ±ºÜºÃµÄÀí½â¡£ËäÈ»±¾Õ·¶ÀýÖеÄÀàÃû·´Ó³ÁËÉè¼ÆÄ£Ê½µÄÃû×ÖÒÔ¼°Ìض¨µÄʵÏÖ·½Ê½£¬µ«ÊÇÕâ²¢²»ÊDZØÐëµÄ¡£Õâ½ö½öÊÇΪÁËÀý×ÓµÄÇåÎúÃ÷Á˶ø²»ÊǺõÄÃüÃû¹æ·¶¡£
DbConnectionsÀàÊÇÒ»¸öµ¥¼þģʽÀ࣬Óּ̳ÐÁË×¢²áģʽ——DbConnections×ÛºÏÁËÁ½ÕßµÄÓŵ㡣
ÒÔϵĴúÂëÆ¬¶Ï´´½¨²¢ÔÚ×¢²áģʽÀàÖд洢Á˶Ôÿһ¸öÊý¾Ý¿âµÄÁ¬½Ó¡£
´úÂ룺
| //initial setup, somewhere near the start of your script $dbc=& DbConnections::getInstance(); $dbc->set( 'contacts', new MysqlConnection('user1', 'pass1', 'db1', 'host1')); $dbc->set( 'orders', new MysqlConnection('user2', 'pass2', 'db2', 'host2')); $dbc->set( 'archives', new MysqlConnection('user3', 'pass3', 'db3', 'host3')); |
ÔÚÆäËûÀàÖн«×¢²áģʽÀàÁ¬Í¬Êý¾ÝÒ»ÆðÔØÈë¾Í¿ÉÒÔʹÓò»Í¬µÄÁ¬½ÓÁË¡£
´úÂ룺
| // domain model classes class Customer { var $db; function Customer() { $dbc=& DbConnections::getInstance(); $this->db=& $dbc->get('contacts'); } //... } class Orders { var $db_cur; var $db_hist; function Contact() { $dbc=& DbConnections::getInstance(); $this->db_cur=& $dbc->get('orders'); $this->db_hist=& $dbc->get('archive'); } //... } |
Ò»¸öÀàÒÀ¾Ý¿Í»§Êý¾Ý¿â½¨Ä££¬ÁíÒ»¸öÀàÒÀ¾ÝÀúÊ·ºÍÏÖÔڵĿͻ§¶©µ¥½¨Ä£¡£È¡µÃÕýÈ·µÄÊý¾Ý¿âÁ´½ÓÐèÒªÁ½¸ö²½Ö裺ÕÒµ½×¢²áģʽÀ࣬´ÓÖÐÕÒ³öÓë¸ø¶¨µÄÊôÐÔ£¨key£©ÏàÆ¥ÅäµÄ¶ÔÏó¡£
½«×¢²áģʽʵÏÖΪµ¥¼þģʽ£º
ÈçǰËùÊö£¬°Ñ×¢²áģʽʵÏÖΪµ¥¼þģʽÓкܶàʵÏÖ·½Ê½¡£
µÚÒ»²½£¬½«×¢²áģʽʵÏÖΪµ¥¼þ¶ÔÏ󣬣¨×÷Õß×¢£ºÎÒÃÇÔÚµÚËÄÕ——The Singleton Patternĩβ¼òµ¥ÌÖÂÛ¹ý£©¡£
°´ÕÕÕâÖÖÉè¼Æ£¬×¢²áģʽÀàµÄÈκÎÒ»¸öʵÀý¶¼½«·ÃÎÊͬһ¸öÊý×é¡£ÎÒÃǰÑÕâ¸öÐÂÀà½Ð×ö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 $_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ÀàµÄÁ½¸öʵÀý£¬²¢È·ÈÏËûÃDz»ÊǶÔͬһ¶ÔÏóµÄÒýÓ×—ÔÚÒ»¸öʵÀýÄÚÉèÖÃÒ»¸ö¶ÔÏóµÄÊôÐÔÖµ£¨value£©£¬×îºó֤ʵÁ½¸öʵÀý·µ»ØÏàͬµÄ¶ÔÏó¡£Èô²âÊÔͨ¹ýRegistryGlobalÀà¾ÍÓµÓе¥Ì¬µÄÐÐΪ¡£
´úÂ룺
| define('REGISTRY_GLOBAL_STORE', '__registry_global_store_key__'); class RegistryGlobal {var $_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;] ÕâÒ»ÐУ¬ÒýÓòÙ×÷·û½«È«¾ÖÊý×é°ó¶¨µ½ÊµÀý±äÁ¿$_storeÉÏ¡£ÕâÊǵ¥¼þģʽʵÏֵĹؼüËùÔÚ£ºÃ¿´ÎÔÚ¶ÔÏóÖÐʹÓÃ$this->_store±äÁ¿Ê±£¬×÷Ó÷´Ó³µ½È«¾Ö±äÁ¿ÖС£
µ«ÊDz¢²»ÍƼö»ùÓÚÈ«¾Ö±äÁ¿µÄ½â¾ö·½°¸¡£Èç¹û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->assertReference($reg->get(‘key’), $reg2->get(‘key’)); } } |
Òª×Ô¼ºÊµÏÖÀྲ̬±äÁ¿£¬¿ÉÒÔ½«Ò»¸ö¶Ôº¯Êý¾²Ì¬±äÁ¿µÄÒýÓð󶨵½ÀàµÄʵÀý±äÁ¿ÉÏ¡£
| class RegistryMonoState {var $_store; function &_initRegistry() { static $store = array(); return $store; } function RegistryMonoState() { $this->_store =& $this->_initRegistry(); } 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; } } |
initRegistry()·½·¨°üº¬Ò»¸ö³õʼ»¯ÎªÊý×éµÄ¾²Ì¬±äÁ¿¡£Õâ¸ö¾²Ì¬±äÁ¿Í¨¹ýÒýÓ÷µ»Ø¡£ÔÚ¹¹Ô캯ÊýÖÐ$_storeʵÀý±äÁ¿±»¸³ÓÚͨ¹ýinitRegistry()º¯Êý·µ»ØµÄÒýÓ×—¼´¾²Ì¬Êý×é¡£ºÃ£¡Ò»¸öPHP4µÄÀྲ̬±äÁ¿²úÉúÁË¡£
ʹÓÃÀྲ̬±äÁ¿µÄʵÏÖ£º
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); } } |
½áÂÛ£º
ËäÈ»×¢²áģʽ¼ò»¯Á˶ԴóÁ¿¶ÔÏóµÄ·ÃÎÊ£¬µ«ÊÇÈÔÈ»ÓÐÐí¶àÎÊÌâ——ÓëÈ«¾Ö±äÁ¿ÁªºÏ¡£ÄãÐèҪȷ¶¨ÒªÇóµÄÊôÐÔKeyÔÚ·ÃÎÊÖ®ÒѾ±»³õʼ»¯ÁË£¬¶øÇÒÉèÖÃÊôÐԵķ½·¨¿ÉÒÔÈ«¾Ö·ÃÎÊ£¬ÄãµÄ¶ÔÏóÈÔÈ»¿ÉÄÜÔÚÄãµÄ´úÂëµÄÆäËû²¿·Ö³öºõÒâÁϵı»Ìæ»»µô¡£ÏÔÈ»£¬È«¾ÖÊý¾Ý·Ç³£Óкô¦£¬·½±ã£¬µ«ÊÇÄãÐèҪʱ¿Ì¼ÇסÈκÎÈ«¾ÖÊý¾Ý¶¼ÊÇÓÐһЩ²»°²È«µÄ¡£
ÄÚǶµÄRegistryģʽ
³ýÁ˵¥¶ÀʹÓÃ×¢²áģʽ——Èç±¾ÕÂËùʾ£¬RegistryģʽÓëÆäËû¶ÔÏó½áºÏʱ¹¦ÄÜÒ²ÊǷdz£Ç¿´ó¡£ÀýÈ磺µ±¶ÔÏóµÄ´´½¨´ú¼Û·Ç³£°º¹ó£¨ÀýÈçÐèÒª²éѯ´óÁ¿Êý¾Ý¿âÀ´³õʼ»¯¶ÔÏó£©Ê±£¬¶øÇÒ¶ÔÏóÔÚÕâ¸öÓ¦ÓÃÖб»Ê¹ÓÃÒ»´Î»ò¶à´Î£¬Èç¹ûÕâÑù£¬ÄãÄÜ´´½¨Ò»¸ö½áºÏÁ˹¤×÷ģʽ (¼ûµÚÈýÕÂ) ºÍ×¢²áģʽ µÄ“Finder”ÀàÒÔ»ñµÃÒѾ´´½¨µÄ¶ÔÏóµÄ»º´æ¶ø²»ÓÃÔٴδ´½¨ËûÃÇ£¿
ÒÔÏÂÊÇÒ»¸öContactÀ࣬AddressBookÀàÊǹ¤³§Àà¡£
| class AddressBook { function &findById($id) { return new Contact($id); } } class Contact { function Contact($id) { // expensive queries to create object using $id } // ... other methods } |
Äã¿ÉÒÔÔÚAddressBookÀàÖвåÈëRegistryģʽÀ´Ìṩ»º´æ¡£´úÂë¿ÉÒÔÈçÏÂËùʾ£º
| class AddressBook { var $registry; function AddressBook() { $this->registry =& Registry::getInstance(); } function &findById($id) { if (!$this->registry->isValid($id)) { $this->registry->set($id, new Contact($id)); } return $this->registry->get($id); } } |
AddressBookÀàµÄ¹¹Ô캯Êý½«registry°ó¶¨µ½Ò»¸öʵÀý±äÁ¿¡£µ±´´½¨ÁËÒ»¸öÌØ¶¨µÄID²¢±»findById()·½·¨µ÷ÓÃʱ£¬Registry±»¼ì²éÒÔÈ·¶¨¶ÔÏóÊÇ·ñÒѾ±»»º´æ¡£Èç¹ûûÓУ¬½«´´½¨Ò»¸öеĶÔÏó²¢´æ´¢ÔÚRegistryÖС£±»µ÷ÓõĶÔÏó½«Í¨¹ýº¯Êý´ÓRegistryÖÐÈ¡³ö²¢±»·µ»Ø¡£
ÒÔÉÏËù·ÖÏíµÄÊǹØÓÚ¡¶PHPÉè¼ÆÄ£Ê½½éÉÜ¡·µÚÎåÕ ע²áģʽ£¬ÏÂÃæÊDZà¼ÎªÄãÍÆ¼öµÄÓмÛÖµµÄÓû§»¥¶¯£º
¡¡¡¡Ïà¹ØÎÊÌ⣺PHPÓÐÄļ¸ÖÖÉè¼ÆÄ£Ê½£¿
¡¡¡¡´ð£ºPHP Ò»°ãÓÐÎåÖÖ³£¼ûµÄÉè¼ÆÄ£Ê½ ¹¤³§Ä£Ê½ ¹¤³§Ä£Ê½ ÊÇÒ»ÖÖÀ࣬Ëü¾ßÓÐΪÄú´´½¨¶ÔÏóµÄijЩ·½·¨¡£Äú¿ÉÒÔʹÓù¤³§Àà´´½¨¶ÔÏ󣬶ø²»Ö±½ÓʹÓà new¡£ÕâÑù£¬Èç¹ûÄúÏëÒª¸ü¸ÄËù´´½¨µÄ¶ÔÏóÀàÐÍ£¬Ö»Ðè¸ü¸Ä¸Ã¹¤³§¼´¿É¡£Ê¹Óøù¤³§µÄËùÓдúÂë»á×Ô¶¯¸ü¸Ä¡£ ÀýÈç... >>Ïêϸ
¡¡¡¡Ïà¹ØÎÊÌ⣺½éÉܼ¸¸öÄã±È½ÏÊìϤµÄÉè¼ÆÄ£Ê½,²¢¼òµ¥½éÉÜËüÃÇÊÇÈç...
¡¡¡¡´ð£ºÈçºÎ×öºÃ¼ô¼ÄØ£¿Ôڴ˱ÊÕß̸̸×Ô¼ºµÄ¹Ûµã£º¼ô¼¾ÍÊǽ«²»·ûºÏÖ÷ÌâµÄ²¿·Öɾ³ý²¢ÕâÀﻹ½éÉܼ¸¸ö¹ý¶ÉЧ¹ûµÄ²é¿´¼¼ÇÉ£ºÔÚTransitionsÃæ°åµÄ´°¿Ú¿ØÖƲ˵¥ÖУ¬Ñ¡Ôñ >>Ïêϸ
¡¡¡¡Ïà¹ØÎÊÌ⣺ÎÒÒ»¿ªÊ¼¾ÍÏëÍùÉè¼ÆÄ£Ê½¼Ü¹¹ÉÏ×ߣ¬
¡¡¡¡´ð£ºÏëÕâ´Î²Î¼Óµç×ÓÉè¼Æ´óÈüÍêºó£¬½øÈëǶÈëʽѧϰ£¡ÎÒÒ»Ö±¶¼ÓÐѧϰlinux²Ù×÷ϵͳ£¬2¡¢Ç§Íò±ðÖ½ÉÏ̸±ø£¬Êé±¾µÄѧϰÀëʵ¼Ê¹¤×÷µÄÊìÁ·²Ù×÷»¹Óкܳ¤Ò»¶Î¾àÀ룬ϣÍû >>Ïêϸ
- ÆÀÂÛÁÐ±í£¨ÍøÓÑÆÀÂÛ½ö¹©ÍøÓѱí´ï¸öÈË¿´·¨£¬²¢²»±íÃ÷±¾Õ¾Í¬ÒâÆä¹Ûµã»ò֤ʵÆäÃèÊö£©
-
