»¶ÓÄú·ÃÎÊÎÒ°®IT¼¼ÊõÍø£¬½ñÌìС±àΪÄã·ÖÏíµÄ±à³Ì¼¼ÊõÊÇ£º¡¾¡¶PHPÉè¼ÆÄ£Ê½½éÉÜ¡·µÚ°ËÕ µü´úÆ÷ģʽ¡¿£¬ÏÂÃæÊÇÏêϸµÄ·ÖÏí£¡
¡¶PHPÉè¼ÆÄ£Ê½½éÉÜ¡·µÚ°ËÕ µü´úÆ÷ģʽ
ÀàÖеÄÃæÏò¶ÔÏó±à³Ì·â×°Ó¦ÓÃÂß¼¡£À࣬¾ÍÊÇʵÀý»¯µÄ¶ÔÏó£¬Ã¿¸öµ¥¶ÀµÄ¶ÔÏó¶¼ÓÐÒ»¸öÌØ¶¨µÄÉí·ÝºÍ״̬¡£µ¥¶ÀµÄ¶ÔÏóÊÇÒ»ÖÖ×éÖ¯´úÂëµÄÓÐÓ÷½·¨£¬µ«Í¨³£Äã»á´¦ÀíÒ»×é¶ÔÏó»òÕß¼¯ºÏ¡£
ÊôÐÔÀ´×Ô SQL ²éѯµÄÒ»×éÊý¾Ý¾ÍÊÇÒ»¸ö¼¯ºÏ£¬¾ÍÏñ±¾ÊéÇ°ÃæÕ½ڽéÉÜµÄ Monopoly ÓÎϷʾÀýµÄ¶ÔÏóÁÐ±í¡£
¼¯ºÏ²»Ò»¶¨ÊǾùÒ»µÄ¡£Í¼ÐÎÓû§½çÃæ¿ò¼ÜÖÐµÄ Window ¶ÔÏó¿ÉÒÔÊÕ¼¯ÈÎÒâÊýÁ¿µÄ¿ØÖƶÔÏó £ Menu¡¢Slider ºÍ Button¡£²¢ÇÒ£¬¼¯ºÏµÄʵÏÖ¿ÉÒÔÓжàÖÖ·½Ê½£ºPHP Êý×ÖÊÇÒ»¸ö¼¯ºÏ£¬µ«Ò²ÊÇÒ»¸öÉ¢ÁÐ±í£¬Ò»¸öÁ´½ÓÁÐ±í£¬Ò»¸ö¶ÑÕ»ÒÔ¼°¶ÓÁС£
ÎÊÌâ
ÈçºÎ²Ù×ÝÈÎÒâµÄ¶ÔÏ󼯺ϣ¿
½â¾ö·½°¸
ʹÓõü´úÆ÷ģʽÀ´Ìṩ¶Ô¼¯ºÏÄÚÈݵÄͳһ´æÈ¡¡£
Äã¿ÉÄÜûÓÐÒâʶµ½ÕâÒ»µã£¬µ«ÄãÿÌì¶¼ÔÚʹÓõü´úÆ÷ģʽ £ ËüDZ²ØÔÚ PHP µÄÊý×éÀàÐͺ͸÷ÖÖÊý×é²Ù×÷º¯ÊýÖС££¨Æäʵ£¬¸øÄãһЩ¹ÌÓÐÀàµÄÊý×éµÄ×éºÏºÍһȺÓÃÕâЩ¹ÌÓÐÀ๤×÷µÄ¿É±äº¯Êý£¬Ä㽫²»µÃ²»Ê¹ÓÃÕâЩÊý×éÀ´´¦Àí¶ÔÏ󼯺ϡ£ÕâÊÇÔÚ PHP Öеı¾µØÊý×éµü´ú£º
| $test = array(‘one’, ‘two’, ‘three’); $output = ‘’; reset($test); do { $output .= current($test); } while (next($test)); echo $output; // produces ‘onetwothree’ |
reset() º¯Êý½«µü´úÖØÐÂתµ½Êý×éµÄ¿ªÊ¼£»current() ·µ»Øµ±Ç°ÔªËصÄÖµ£»next() Ôòǰ½øÖÁÊý×éÖеÄÏÂÒ»¸öÔªËØ²¢·µ»ØÐ嵀 current() Öµ¡£µ±Ä㳬³öÊý×éµÄ×îºóÒ»¸öÔªËØÊ±£¬next() ·µ»Ø false¡£Ê¹ÓÃÕâЩµü´ú·½·¨£¬PHP Êý×éµÄÄÚ²¿ÊµÏÖ¾ÍÓëÄã²»Ïà¹ØÁË¡£µü´úÆ÷½áºÏÁË·â×°ºÍ¶à̬µÄÃæÏò¶ÔÏó³ÌÐòÉè¼ÆÔÀí¡£Ê¹Óõü´úÆ÷£¬Äã¿ÉÒÔ¶Ô¼¯ºÏÖеĶÔÏó½øÐвÙ×÷£¬¶øÎÞÐèרÃÅÁ˽⼯ºÏÈçºÎÏÔÏÖ»òÕß¼¯ºÏ°üº¬Ê²Ã´£¨¶ÔÏóµÄÖÖÀࣩ¡£µü´úÆ÷ÌṩÁ˲»Í¬¹Ì¶¨µü´úʵÏÖµÄͳһ½Ó¿Ú£¬ËüÍêÈ«°üº¬ÁËÈçºÎ²Ù×ÝÌØ¶¨¼¯ºÏµÄÏêϸÐÅÏ¢£¬°üÀ¨ÏÔʾÄÄЩÏ¹ýÂË£©¼°ÆäÏÔʾ˳Ðò(ÅÅÐò)¡£
ÈÃÎÒÃÇ´´½¨Ò»¸ö¼òµ¥µÄ¶ÔÏó£¬ÔÚÊý×éÖжÔËü½øÐвÙ×÷¡££¨¾¡¹Ü¸ÃʾÀýÔÚ PHP5 »·¾³Ï£¬µ«µü´úÆ÷²¢²»Ìض¨ÓÚ PHP5¡£ËäÈ»Ìí¼ÓÁ˽϶àµÄÒýÓòÙ×÷·û£¬±¾Õ½ÚÖеĴó¶àÊýʾÀýÔÚ PHP4 ÏÂÒ²Äܹ»ÔËÐУ©¡£¶ÔÏó Lendable ±íʾÖîÈçµçÓ°¡¢Ïà²áµÈýÌ壬Ëü×÷Ϊ web Õ¾µãµÄÒ»²¿·Ö»ò·þÎñ£¬ÔÊÐíÓû§ä¯ÀÀ»ò½«ËûÃǵÄýÌ弯ºÏ·ÖÏí¸øÆäËûÓû§¡££¨¶Ô ÓÚ¸ÃʾÀý£¬ÇëÎÞÐ迼ÂÇÆäËû·½Ãæ¡££©ÈÃÎÒÃÇ¿ªÊ¼ÏÂÃæ¶Ô Lendable »ù´¡Éè¼ÆµÄ²âÊÔ¡£
| // PHP5 class LendableTestCase extends UnitTestCase { function TestCheckout() { $item = new Lendable; $this->assertFalse($item->borrower); $item->checkout(‘John’); $this->assertEqual(‘borrowed’, $item->status); $this->assertEqual(‘John’, $item->borrower); } function TestCheckin() { $item = new Lendable; $item->checkout(‘John’); $item->checkin(); $this->assertEqual(‘library’, $item->status); $this->assertFalse($item->borrower); } } |
ҪʵÏÖÕâÒ»×î³õ²âÊÔµÄÐèÇó£¬ÎÒÃÇÀ´´´½¨Ò»¸ö´øÓÐÈô¸É¹«¹²ÊôÐÔºÍһЩ·½·¨µÄÀ࣬
À´´¥·¢ÕâЩÊôÐÔµÄÖµ£º
| class Lendable { public $status = ‘library’; public $borrower = ‘’; public function checkout($borrower) { $this->status = ‘borrowed’; $this->borrower = $borrower; } public function checkin() { $this->status = ‘library’; $this->borrower = ‘’; } } |
Lendable ÊÇÒ»¸öºÃµÄ£¬ÆÕͨµÄ¿ª¶Ë¡£ÈÃÎÒÃǽ«ËüÀ©Õ¹µ½ÖîÈç DVD »ò CD µÄ´ÅµÀÏýÌåÀ©Õ¹ÁË Lendable£¬²¢ÇҴŵÀÏêϸ¼Ç¼ÁËÌØ¶¨Ã½ÌåµÄÏêϸÐÅÏ¢£¬°üÀ¨ÏîÄ¿µÄÃû³Æ£¬·¢²¼µÄÄê·ÝÒÔ¼°Ïî±¾ÉíµÄÀàÐÍ£º
| class Media extends Lendable { public $name; public $type; public $year; public function __construct($name, $year, $type=’dvd’ ) { $this->name = $name; $this->type = $type; $this->year = (int)$year; } } |
ҪʹÊÂÇé¸ü¼Ó¼òµ¥£¬Ã½ÌåÓÐÈý¸ö¹«¹²µÄʵÀý±äÁ¿£¬Media::name£¬Media::year ºÍMedia::type¡£¹¹Ô캯Êý²ÉÓÃÁËÁ½¸ö²ÎÊý£¬½«µÚÒ»¸ö´æ´¢ÔÚ $name ÖУ¬µÚ¶þ¸ö´æ´¢ÔÚ $year ÖС£¹¹Ô캯Êý»¹ÔÊÐí¿ÉÑ¡µÄµÚÈý¸ö²ÎÊýÀ´Ö¸¶¨ÀàÐÍ£¨È±Ê¡Îªdvd£©¡£
¸ø¶¨µ¥¶ÀµÄ¶ÔÏóÀ´²Ù×÷£¬ÄãÏÖÔÚ¿ÉÒÔ´´½¨Ò»¸öÈÝÆ÷À´°üº¬ËûÃÇ£ºLibrary¡£ÀàËÆÓÚ³£ÓõĿ⣬Library Ó¦¸ÃÄܹ»Ìí¼Ó£¬É¾³ýºÍ¼ÆË㼯ºÏÖеÄÏî¡£ÉõÖÁ£¬Library »¹Ó¦¸ÃÔÊÐí·ÃÎʼ¯ºÏ£¨±¾ÕÂÖеÄÑù±¾´úÂ벿·Ö¿É¿´µ½Ê¾Àý£©Öеĵ¥Ò»µÄÏ¶ÔÏ󣩡£
ÎÒÃÇ¿ªÊ¼¹¹½¨ Library µÄ²âÊÔÓÃÀý¡£
| class LibraryTestCase extends UnitTestCase { function TestCount() { $lib = new Library; $this->assertEqual(0, $lib->count()); } } |
ËüÊÇÂú×ãÕâÒ»²âÊԵļòµ¥Àࣺ
| class Library { function count() { return 0; } } |
¼ÌÐø½«Ò»Ð©ÓÐȤµÄ¹¦ÄÜÌí¼Óµ½²âÊÔÖУº
| class LibraryTestCase extends UnitTestCase { function TestCount() { } function TestAdd() { $lib = new Library; $lib->add(‘one’); $this->assertEqual(1, $lib->count()); } } |
ʵÏÖ add() µÄ¼òµ¥·½·¨Êǽ¨Á¢ÔÚ PHP Áé»îÊý×麯ÊýµÄ»ù´¡ÉÏ£ºÄã¿ÉÒÔ½«ÏîÌí¼Óµ½ÊµÀý±äÁ¿²¢Ê¹Óà count() À´·µ»Ø¼¯ºÏÖÚÏîµÄÊýÁ¿¡£
class Library { protected $collection = array(); function count() { return count($this->collection); } function add($item) { $this->collection[] = $item; } } |
Library ÏÖÔÚÊÇÒ»¸ö¼¯ºÏ£¬µ«ËüûÓÐÌṩ¼ìË÷»ò²Ù×ݵ¥Ò»Êý×é³ÉÔ±µÄ·½·¨¡£
ÎÒÃǻص½±¾ÕµÄÖØµã£¬µü´úÆ÷Éè¼ÆÄ£Ê½µÄʵÏÖ¡£ÏÂÁÐ UML ÀàͼÏÔʾÁË GoF µü´úÆ÷ģʽÓë Media ºÍ Library Àà½áºÏʹÓù®¹ÌʾÀýµÄ·½·¨¡£
ÄãµÄ¼¯ºÏÀà±ØÐëÌṩ Factory£¨²Î¼ûµÚ 3 Õ£©À´´´½¨µü´úÆ÷µÄʵÀý¡£
µü´úÆ÷ÀඨÒå first() תµ½¼¯ºÏ¿ªÊ¼µÄ½Ó¿Ú£¬
next() ÒÆµ½ÐòÁÐÖеÄÏÂÒ»¸öÏî×÷ΪÄãµÄÑ»·£¬currentItem() ´Ó¼¯ºÏ¼ìË÷µ±Ç°µÄÏî×÷ΪÄãµÄÑ»·£¬ isDone() ÓÃÓÚÖ¸³öÄãÔÚÕû¸ö¼¯ºÏÖÐÑ»·½áÊøµÄʱ¼ä¡£
ÔړʾÀý´úÂ딲¿·Ö£¬LibraryGofIterator ÀàÊÇÒ»¸öÖ±½ÓʵÏÖ GoF µü´úÆ÷Éè¼ÆÄ£Ê½µÄʾÀý¡£
Ñù±¾´úÂë
ÔÚ Library ÄÚʵÏÖ GoF µü´úÆ÷ģʽµÄµÚÒ»²½ÊÇΪеľßÌåµü´úÆ÷дһ¸öеIJâÊÔÓÃÀý¡£ÒòΪÿһÖÖ²âÊÔ·½·¨¶¼½«²Ù×ݰüº¬ Media ʵÀýµÄ Library£¬Äã¿ÉÒÔÇå¿Õ UnitTestCase::setUp() ·½·¨£¬´Ó¶øÔÚÿÖÖ²âÊÔµÄÒÑ֪״̬Ͻ«±äÁ¿Ìî³äµ½ Library ÖС£
Ê×ÏÈ£¬½« Library::getIterator() ·½·¨×÷ΪLibraryGofIterator ÀàµÄ Ò»¸ö Factory ʵÀý¡£
| class IteratorTestCase extends UnitTestCase { protected $lib; function setup() { $this->lib = new Library; $this->lib->add(new Media(‘name1’, 2000)); $this->lib->add(new Media(‘name2’, 2002)); $this->lib->add(new Media(‘name3’, 2001)); } function TestGetGofIterator() { $this->assertIsA($it = $this->lib->getIterator() ,’LibraryGofIterator’); } } |
ʵÏÖ£º
| class Library { // ... function getIterator() { return new LibraryGofIterator($this->collection); } } |
getIterator() ·½·¨½« Library µÄ $collection ´«µÝ¸øÐµľßÌåµü´úÆ÷½á¹¹¡£ÕâÒ»·½·¨ÓÐÁ½¸öÖØÒªµÄʵÏÖ£ºÃ¿¸öµü´úÆ÷¶¼ÊǶÀÁ¢µÄ£¬Òò´Ë¿ÉÒÔͬʱ²Ù×÷¶à¸öµü´úÆ÷¡£ÁíÍ⣬µü´úÆ÷ÔÚÊý×éÉϵIJÙ×÷Êǵ±µü´úÆ÷±»ÇëÇóʱ²ÅÖ´Ðеġ£Èç¹ûÖ®ºó½«ÁíÒ»¸öÏîÌí¼Óµ½¼¯ºÏÖУ¬Äã±ØÐëÇëÇóÁíÒ»¸öµü´úÆ÷À´ÏÔʾËü£¨ÖÁÉÙÊÇÔÚ¸ÃʵÏÖÖУ©¡£ÈÃÎÒÃÇͨ¹ý½«ÉùÃ÷Ìí¼Óµ½ TestGetGofIterator() ·½·¨ÒÔÆ¥Åäµü´úÆ÷Éè¼ÆÄ£Ê½£¬¼ÌÐø¶Ô²âÊÔ½øÐмÓÇ¿¡£
Èç¹ûÄãÒѾ¶ÔÕû¸ö¼¯ºÏ½øÐбéÀú£¬Ôò isDone() ·½·¨Ö»Ó¦¸ÃΪ true¡£Èç¹û iterator ¸Õ¸Õ´´½¨£¬Ôò isDone() ÏÔÈ»·µ»Ø false£¬´Ó¶øÖ¸³ö¼¯ºÏ¿ÉÒÔ±éÀú¡£
| class IteratorTestCase extends UnitTestCase { function setup() { } function TestGetGofIterator() { $this->assertIsA($it = $this->lib->getIterator() ,’LibraryGofIterator’); $this->assertFalse($it->isdone()); } } |
Óë TDD Ò»Ñù£¬¾¡¿ÉÄÜʵÏÖ×î¼òµ¥µÄ´úÂëÀ´Âú×ãÄãµÄ²âÊÔÓÃÀý£º
| class LibraryGofIterator { function isDone() { return false; } } |
Òò´Ë£¬ÔÚµÚÒ»¸öµü´úÆ÷¼ä£¬Ó¦¸Ã·¢ÉúÊ²Ã´ÄØ£¿ currentItem() Ó¦¸Ã·µ»ØµÚÒ»¸ö Media ¶ÔÏó£¬Õâ¸ö¶ÔÏóÊÇÔÚ IteratorTestCase::setUp() ·½·¨ÖÐÌí¼ÓµÄ£¬isDone() Ó¦¸Ã¼ÌÐøÎª false£¬ÒòΪÁíÁ½¸öÏîÈÔÈ»µÈ´ý±éÀú¡£
| class IteratorTestCase extends UnitTestCase { function setup() { } function TestGetGofIterator() { $this->assertIsA($it = $this->lib->getIterator() ,’LibraryGofIterator’); $this->assertFalse($it->isdone()); $this->assertIsA($first = $it->currentItem(), ‘Media’); $this->assertEqual(‘name1’, $first->name); $this->assertFalse($it->isdone()); } } |
LibraryGofIterator ½ÓÊÕÁ˹¹Ô캯ÊýÖÐµÄ $collection£¬ ÕâÒ»µã·Ç³£ÖØÒª£¨²Î¼ûÉÏÃæµÄ Library ×îС»¯ÊµÏÖ£©²¢´Ó currentItem£¨£© ·½·¨·µ»Ø current() Ïî¡£
| class LibraryGofIterator { protected $collection; function __construct($collection) { $this->collection = $collection; } function currentItem() { return current($this->collection); } function isDone() { return false; } } |
ÔÚÏÂÒ»¸öµü´ú»á³öÏÖʲô£¿ next() ·½·¨Ó¦¸Ã¸ü¸ÄcurrentItem() ·½·¨·µ»ØµÄÏî¡£ÏÂÃæµÄ²âÊÔ²¶»ñÁËËùÆÚÍûµÄÐÐΪ£º
| class IteratorTestCase extends UnitTestCase { function setup() { } function TestGetGofIterator() { $this->assertIsA($it = $this->lib->getIterator(), ‘LibraryGofIterator’); $this->assertFalse($it->isdone()); $this->assertIsA($first = $it->currentItem(), ‘Media’); $this->assertEqual(‘name1’, $first->name); $this->assertFalse($it->isdone()); $this->assertTrue($it->next()); $this->assertIsA($second = $it->currentItem(), ‘Media’); $this->assertEqual(‘name2’, $second->name); $this->assertFalse($it->isdone()); } } |
ÖØÐ½¨Á¢ÔÚ PHP µÄÊý×麯ÊýÖ®ÉÏ£¬ÔÚÊý×éÉÏʹÓà next()£º
| class LibraryGofIterator { protected $collection; function __construct($collection) { $this->collection = $collection; } function currentItem() { return current($this->collection); } function next() { return next($this->collection); } function isDone() { return false; } } |
³ýÁË isDone() ·½·¨±ØÐë·µ»Ø Ö®Íâ,µÚÈý¸öµü´ú¿´ÆðÀ´ºÜÏñÆäËûµÄµü´ú¡£Ä㻹ϣÍû next() Äܹ»³É¹¦ÒƵ½ÏÂÒ»¸öµü´ú£º
| class IteratorTestCase extends UnitTestCase { function setup() { } function TestGetGofIterator() { $this->assertIsA($it = $this->lib->getIterator(), ‘LibraryGofIterator’); $this->assertFalse($it->isdone()); $this->assertIsA($first = $it->currentItem(), ‘Media’); $this->assertEqual(‘name1’, $first->name); $this->assertFalse($it->isdone()); $this->assertTrue($it->next()); $this->assertIsA($second = $it->currentItem(), ‘Media’); $this->assertEqual(‘name2’, $second->name); $this->assertFalse($it->isdone()); $this->assertTrue($it->next()); $this->assertIsA($third = $it->currentItem(), ‘Media’); $this->assertEqual(‘name3’, $third->name); $this->assertFalse($it->next()); $this->assertTrue($it->isdone()); } } |
¶Ô next() ºÍ isDone() ·½·¨ÉÔ¼ÓÐ޸ģ¬ËùÓеIJâÊÔ¶¼Í¨¹ýÁË¡£´úÂëÈçÏ£º
| class LibraryGofIterator { protected $collection; function __construct($collection) { $this->collection = $collection; } function first() { reset($this->collection); } function next() { return (false !== next($this->collection)); } function isDone() { return (false === current($this->collection)); } function currentItem() { return current($this->collection); } } |
µü´úÆ÷²âÊÔÓÃÀýÖ»´æÔÚÒ»¸öÎÊÌ⣺ËüûÓз´Ó³µü´úÆ÷µÄµäÐÍÓ÷¨¡£Êǵģ¬Ëü²âÊÔÁ˵ü´úÆ÷ģʽµÄËùÓй¦ÄÜ£¬µ«Ó¦ÓóÌÐòÐèÒª²ÉÓøü¼òµ¥µÄ·½·¨À´Ê¹Óõü´úÆ÷¡£Òò´Ë£¬ÏÂÒ»²½ÊÇʹÓøüÌùʵ¼ÊµÄ´úÂëÀ´±àд²âÊÔ¡£
| class IteratorTestCase extends UnitTestCase { protected $lib; function setup() { } function TestGetGofIterator() { } function TestGofIteratorUsage() { $output = ‘’; for ($it=$this->lib->getIterator(); !$it->isDone(); $it->next()){ $output .= $it->currentItem()->name; } $this->assertEqual(‘name1name2name3’, $output); } } |
Ŀǰ£¬µü´úÆ÷µÄʵÏÖ¸´ÖÆÁËij¸öÊý×飨¼¯ºÏ£©£¬²¢Ê¹Óà PHP µÄÄÚ²¿Ö¸ÕëÀ´¸ú×Ùµü´ú¡£Ä㻹¿ÉÒÔͨ¹ý×Ô¼º¸ú×Ù¼¯ºÏË÷ÒýÀ´ÊµÏÖµü´úÆ÷¡£ÕâÐèÒª Library ÖеÄÒ»ÖÖÐ嵀 accessor ·½·¨À´Í¨¹ý¹Ø¼ü×Ö·ÃÎʶÔÏó¡£
| class Library { // ... function get($key) { if (array_key_exists($key, $this->collection)) { return $this->collection[$key]; } } } |
ͬÑù£¬ÔÚ Library::getIterator() ·½·¨ÖУ¬Äã¿ÉÄܽ« $this£¨library ±¾Éí£©´«µÝ¸ø¹¹Ôì³ÌÐò£¬¶ø²»Êǽ« $this ´«µÝ¸ø¼¯ºÏ£¨Êý×é°üº¬Media ¼¯ºÏ£©¡£ÍⲿµÄµü´úÆ÷È»ºóÖ»ÊÇÄÚ²¿µØ¸ú×ÙÖ¸ÕëÒÔÁ˽âËüµ±Ç°ÒýÓõÄÊÇÄÄÒ»¸ö Library ¼¯ºÏÔªËØ£¬²¢½«Ê¹Óù¹ÔìÐÐÊýÖдÓÒýÓõ½ Library µÄ´«µÝÀ´¼ìË÷µ±Ç°µÄ¶ÔÏó¡£
|
class LibraryGofExternalIterator { |
²»Í¬µÄµü´úÆ÷ API
ËäÈ»Ç°ÃæµÄ´úÂëÊÇ GoF ËùÊöµü´úÆ÷ģʽµÄÍêÕûʵÏÖ£¬Ä㻹¿ÉÄܻᷢÏÖËÄÖÖ·½·¨µÄ API ÓÐÒ»µãÓ·Öס£Èç¹ûÊÇ£¬Äã¿ÉÒÔ½« collapse next(), currentItem(), ºÍ isDone() ¶¼²¢Èë next() ÖУ¬ÓÃÀ´´Ó¼¯ºÏÖзµ»Ø±¾Ïî»òÏÂÒ»Ï»òÕßÈç¹ûÕû¸ö¼¯ºÏ±»±éÀú¹ýÁË£¬Ôò·µ»Ø false¡£ÕâÊÇÒ»¸ö²âÊÔ²»Í¬ API µÄ´úÂ룺
|
class IteratorTestCase extends UnitTestCase { |
|
class Library { |
|
class LibraryIterator { |
Çë×¢Òâµ÷ÊÔ½á¹ûµÄºìÉ«±ê¼Ç£¡Ê²Ã´µ¼Ö·¢Éú´íÎó“Equal expectation fails at character 4 with name1name2name3 and name2name3”£¿²»ÖªºÎ¹Ê£¬Ìø¹ýÁ˵ÚÒ»´Îµü´ú £ ÕâÊÇ bug¡£ÒªÐÞ¶©¸Ã´íÎ󣬶ÔÓÚ next() ·½·¨µÄµÚÒ»´Îµ÷Ó㬷µ»Ø current()¡£
| class LibraryIterator { protected $collection; protected $first=true; function __construct($collection) { $this->collection = $collection; } function next() { if ($this->first) { $this->first = false; return current($this->collection); } return next($this->collection); } } |
Presto! ÂÌÉ«ÌõºÍ¸Ä½øµÄ while Ñ»·µü´úÆ÷¡£
¹ýÂ˵ü´úÆ÷
ÀûÓõü´úÆ÷£¬Äã²»½ö½ö¿ÉÒÔÏÔʾ¼¯ºÏÖеÄÿһÏî¡£Ä㻹¿ÉÒÔÑ¡ÔñÏÔʾµÄÏî¡£ÐÞ¸Ä Library::getIterator() À´Ê¹ÓÃÆäËüÁ½ÖÖµü´úÆ÷ÀàÐÍ¡£
| class Library { // ... function getIterator($type=false) { switch (strtolower($type)) { case ‘media’: $iterator_class = ‘LibraryIterator’; break; case ‘available’: $iterator_class = ‘LibraryAvailableIterator’; break; case ‘released’: $iterator_class = ‘LibraryReleasedIterator’; break; default: $iterator_class = ‘LibraryGofIterator’; } return new $iterator_class($this->collection); } } |
Àà LibraryAvailableIterator ½ö¿ÉÒÔµü´ú״̬Ϊ“library”µÄÏ¨ÖØÐµ÷Óà checkOut() ·½·¨£¬½«×´Ì¬¸ü¸ÄΪ“borrowed”£©¡£
|
class IteratorTestCase extends UnitTestCase { |
| class LibraryAvailableIterator { protected $collection = array(); protected $first=true; function __construct($collection) { $this->collection = $collection; } function next() { if ($this->first) { $this->first = false; $ret = current($this->collection); } else { $ret = next($this->collection); } if ($ret && ‘library’ != $ret->status) { return $this->next(); } return $ret; } } |
µü´úÆ÷²»½ö¿ÉÒÔÏÔʾȫ²¿»ò²¿·Ö¼¯ºÏ¡£¶øÇÒ£¬»¹¿ÉÒÔ°´Ìض¨Ë³ÐòÏÔʾ¼¯ºÏ¡£ÏÂÃæ£¬´´½¨Ò»¸ö°´¼¯ºÏÖÚ½éÖʵķ¢²¼ÈÕÆÚ½øÐÐÅÅÐòµÄµü´úÆ÷¡£ÎªÁ˽øÐвâÊÔ£¬ÇëÌí¼ÓijЩÈÕÆÚÔÚ setUp() ·½·¨ÖÐÌí¼ÓµÄÏîÖ®ºóµÄ½éÖÊʵÀý¡£Èç¹ûµü´úÆ÷ÔËÐУ¬ÔòÕâЩÈÕÆÚ½ÏºóµÄÏîÓ¦¸ÃλÓÚµü´ú²Ù×÷µÄ×îÇ°Ãæ¡£
| class IteratorTestCase extends UnitTestCase { // ... function TestReleasedIteratorUsage() { $this->lib->add(new Media(‘second’, 1999)); $this->lib->add(new Media(‘first’, 1989)); $this->assertIsA( $it = $this->lib->getIterator(‘released’) ,’LibraryReleasedIterator’); $output = array(); while ($item = $it->next()) { $output[] = $item->name .’-’. $item->year; } $this->assertEqual( ‘first-1989 second-1999 name1-2000 name3-2001 name2-2002’ ,implode(‘ ‘,$output)); } } |
¸Ã²âÊÔʹÓõÄÏîÔÚÿ¸öµü´úÖÐÂÔÓв»Í¬£º²¢²»½ö½öÊÇÔÚ×Ö·û´®ÖµºóÌí¼Ó $name£¬¶øÊÇ£¬×Ö·û´®Í¬Ê±¾ßÓÐ $name ºÍ $year ÊôÐÔ£¬ÕâЩÊôÐÔËæºó½«±»Ìí¼Óµ½ $output Êý×é¡£LibraryReleasedIterator µÄʵÏÖÓë LibraryIterator ·Ç³£ÀàËÆ£¬³ýÁË constuctor ÖеÄÒ»ÐÐÓï¾ä£º
| class LibraryReleasedIterator extends LibraryIterator { function __construct($collection) { usort($collection, create_function(‘$a,$b’,’ return ($a->year - $b->year);’)); $this->collection = $collection; } } |
ÓôÖÌå±íʾµÄÕâÒ»Ðн« $collection Êý×éÅÅÔÚµü´ú֮ǰ¡£Äã¿ÉÒÔͨ¹ý¼òµ¥µØ¼Ì³Ð LibraryIterator À࣬À´±ÜÃâ¸´ÖÆ¸ÃÀàµÄÆäËüËùÓдúÂë¡£¿ÉÒÔʹÓÃÍⲿµü´úÆ÷À´ÊµÏÖÏàͬµÄÅÅÐòµü´úÂð£¿Êǵ쬵«ÊÇÄã±ØÐë×¢ÒâÍê³ÉËüµÄ¾÷ÇÏ¡£
|
class LibraryReleasedExternalIterator { |
ÆäÖУ¬¹Ø¼üÊÇ´´½¨ÓÃÓÚÅÅÐòµÄʵÓóÌÐòº¯Êý¡£ÅÅÐòº¯Êý±ØÐëÄܹ»·ÃÎʼ¯ºÏ£¬ÒÔ±ã¿ÉÒÔ»ñÈ¡¶ÔÕÕ³ÉÔ±¡£È»¶ø£¬ÒòΪ gener- ated º¯ÊýÔÚ usort() ÖÐʹÓã¬Ã»Óн«¼¯ºÏ×÷ΪÆäËü²ÎÊý´«µÝµÄÑ¡Ïî¡£Ïà·´£¬Äã¿ÉÒÔÀûÓÃÉÏÊö´úÂë¿éÖÐÏÔʾµÄ¾÷ÇÏ£¬ÔÚÀûÓà usort() µ÷Óú¯Êý֮ǰ£¬½«ÒýÓô洢ÔÚº¯ÊýÖÐÄÚ²¿µÄ¼¯ºÏÖС£ÅÅÐòµÄÏîÊǼ¯ºÏµÄ¹Ø¼ü×ÖÁÐ±í¡£µ± usort() Íê³Éʱ£¬¹Ø¼ü×ֻᰴÕÕ¼¯ºÏÖÐÿ¸ö¶ÔÏóµÄ year ÊôÐÔµÄ˳Ðò½øÐÐÅÅÐò¡£ÔÚ next() ·½·¨ÖУ¬¿ÉÒÔͨ¹ý get() ·½·¨·ÃÎʼ¯ºÏÖеĶÔÏ󣬶ø²»ÊǼä½Óͨ¹ý $sorted_keys Ó³Éä¡£Èç¹ûÖØÐµ÷ÓÃÍⲿ°æ±¾µÄ GoF ·ç¸ñµÄµü´úÆ÷£¬Ôò²»Á¬ÐøµÄÊý×é»ò¹Ø¼ü×ÖÖеÄ×Ö·û´®¿ÉÄÜ»áÓÐÎÊÌâ¡£¿ÉÒÔʹÓÃÕë¶Ô sim- ple Íⲿµü´úÆ÷µÄÏàͬ¾÷ÇÏ£¬À´¼õÉٹؼü×Ö˳Ðò²»Á¬¹áµÄÎÊÌâ¡£
SPL µü´úÆ÷
¡¶µü´úÆ÷Éè¼ÆÄ£Ê½ºÍ PHP¡·ÖбØÐëÂÛÊö“±ê×¼ PHP ¿â”£¨SPL£©µü´úÆ÷¡£ËäÈ»£¬Ê¹Óà while Ñ»·½á¹¹¿ÉÒԷdz£½ô´Õ£¬²¢ÇÒÒ²ºÜÓÐÓ㬵«ÊÇ PHP ´úÂë»òÐí¸üÊʺÏÊý×éµü´úµÄ foreach ½á¹¹¡£Ö±½ÓÔÚ foreach Ñ»·ÖÐʹÓü¯ºÏºÏÊÊÂð£¿ÕâÆäʵ¾ÍÊÇ SPL µü´úÆ÷µÄÄ¿±ê¡££¨¾¡¹Ü±¾ÕÂÕûƪ¶¼ÊÇд PHP5£¬ÏÂÁÐ SPL ´úÂëÖ»ÄÜÔÚ PHP5 ÖÐÔËÐУ¬²¢ÇÒ½öµ±ÔÚ PHP5 ±àÒëÖн« SPL ÆôÓᣣ©
Fuecks д¹ýһƪÎÄÕ£¬ÏêϸµØ½éÉÜÁË SPL ºÍ SPL µü´úÆ÷£»Çë²ÎÔÄ http://www.site-
|
point.com/article/php5-standard-library¡£Ê¹Óà SPL ÊÇÒ»ÖÖÍêÈ«²»Í¬µÄʵÏÖµü´úµÄ·½·¨£¬Òò´ËÊ×ÏȽéÉÜÒ»¸öе¥Ôª²âÊÔÀý×ÓºÍÒ»¸öеÄÀà ForeachableLibrary¡£ class SplIteratorTestCase extends UnitTestCase { |
ForeachableLibrary ÊÇʵÏÖ SPL µü´úÆ÷½Ó¿ÚµÄ¼¯ºÏ¡£Äã±ØÐëÖ´ÐÐ 5 ¸öº¯ÊýÀ´´´½¨ SPL µü´úÆ÷£ºcurrent()¡¢next()¡¢key()¡¢valid() ºÍ rewind()¡£ key() ·µ»Ø¼¯ºÏµÄµ±Ç°Ë÷Òý¡£ rewind() ÀàËÆÓÚ reset()£ºÔÚ¼¯ºÏÆô¶¯Ê±ÖØÐÂÆô¶¯µü´ú¡£
| class ForeachableLibrary extends Library implements Iterator { protected $valid; function current() { return current($this->collection); } function next() { $this->valid = (false !== next($this->collection)); } function key() { return key($this->collection); } function valid() { return $this->valid; } function rewind() { $this->valid = (false !== reset($this->collection)); } } |
ÕâÀ¸Ã´úÂë½ö½öʵÏÖÁË´¦Àí $collection ÊôÐԵıØÐèµÄº¯Êý¡££¨Èç¹ûÄãûÓÐʵÏÖËùÓÐ 5 ¸öº¯Êý£¬²¢ÇÒ½«ÊµÏÖµü´úÆ÷Ìí¼Óµ½Àà definition£¬Ôò PHP ½«³öÏÖÖÂÃü´íÎó¡££©²âÊÔÉв»³ÉÊ죬Òò´Ë£¬Ê²Ã´¶¼ÓпÉÄÜ·¢Éú¡£´æÔÚÒ»¸öÎÊÌ⣺ÊÂʵÊÜÏÞÓÚÒ»ÖÖµü´úÀàÐÍ £ ÅÅÐò£¬»òÕß fil- tering ²»¿ÉÓ᣿ÉÒÔ²ÉÈ¡´ëÊ©À´µ÷ÕûÕâÖÖÇé¿ö£¿Êǵģ¡Ó¦ÓôӲßÂÔģʽÖÐѧµ½µÄ֪ʶ£¨Çë²ÎÔÄµÚ 7 Õ£©£¬½« SPL µü´úÆ÷µÄ 5 ¸öº¯Êý×÷ΪÁíÒ»¸ö¶ÔÏóµÄʾÀý¡£ÕâÊǹØÓÚ PolymorphicForeachableLibrary µÄ²âÊÔ¡£
| class PolySplIteratorTestCase extends UnitTestCase { protected $lib; function setup() { $this->lib = new PolymorphicForeachableLibrary; $this->lib->add(new Media(‘name1’, 2000)); $this->lib->add(new Media(‘name2’, 2002)); $this->lib->add(new Media(‘name3’, 2001)); } function TestForeach() { $output =‘’; foreach($this->lib as $item) { $output .= $item->name; } $this->assertEqual(‘name1name2name3’, $output); } } |
ÕâÖÖÇé¿öÓë SplIteratorTestCase ²âÊÔµÄΨһ²î±ðÔÚÓÚ $this->lib ÊôÐÔÀàÊÇÔÚ setUp() ·½·¨Öд´½¨µÄ¡£ÕâÒâζ×Å£ºÕâÁ½¸öÀàµÄÔËÐз½Ê½±ØÐëÒ»Ö¡£PolymorphicForeachableLibrary£ºclass PolymorphicForeachableLibraryÀ©Õ¹¿â
|
implements Iterator { |
| class StandardLibraryIterator { protected $valid; protected $collection; function __construct($collection) { $this->collection = $collection; } function current() { return current($this->collection); } function next() { $this->valid = (false !== next($this->collection)); } function key() { return key($this->collection); } function valid() { return $this->valid; |
²âÊÔÀà
ÏÖÔÚ£¬´úÂë¸ü¼Ó¸´ÔÓÁË£¬µ«ÊÇÆäÈçºÎÖ§³ÖÆäËüµü´úÆ÷ÀàÐÍ£¿Ìí¼ÓÒ»¸ö¹ØÓÚ“·¢Ðа攵ü´úÆ÷µÄ²âÊÔ£¬À´²é¿´ÕâÖÖÉè¼ÆµÄÆäËüµü´úÆ÷ÈçºÎ¹¤×÷¡£
|
class PolySplIteratorTestCase extends UnitTestCase { |
ʹÓÃÁË foreach ¿ØÖƽṹ½øÐÐÑ»·¡£
|
class PolymorphicForeachableLibrary |
Ð嵀 iteratorType() ·½·¨Ê¹Äãת±äҪʹÓõĵü´úÆ÷µÄÀàÐÍ¡££¨ÒòΪµü´úÆ÷ÀàÐͲ¢²»ÊÇÔÚ¶ÔÏó°²×°ÆÚ¼äÑ¡Öе쬲¢ÇÒÄã¿ÉÒÔÔÚ¿ÕÏÐʱÔٴε÷Óà iteratorType() ·½·¨À´Ñ¡Ôñ²»Í¬µü´úÆ÷ÀàÐÍ£¬ËùÒÔʵ¼ÊÉÏÊÇÔÚ State ģʽִÐдúÂ룬¶ø²»ÊÇ Strategy ģʽ¡££©
| class ReleasedLibraryIterator extends StandardLibraryIterator { function __construct($collection) { usort($collection ,create_function(‘$a,$b’,’return ($a->year - $b->year);’)); $this->collection = $collection; } } |
Äã¿ÉÒÔ¼òµ¥µØÍ¨¹ýÀ©Õ¹ StandardLibraryIterator ²¢¸²¸Ç¹¹Ô캯ÊýÀ´Ìí¼ÓÈë¾ÖÊý×éµÄÅÅÐò£¬´Ó¶øÊµÏÖ ReleasedLibraryIterator¡£²¢ÇÒ£¬Í¨¹ýËü£¬Äã¿ÉÒÔÓÐÒ»¸ö working PolymorphicForeachableLibrary¡£
×ܽá
µü´úÆ÷ÊDZê×¼»¯µØµØ´¦ÀíÓ¦ÓóÌÐòÖжÔÏ󼯺ϵķ½·¨¡£ÕâЩÀý×ÓÊÇ»ùÓÚÊý×éµÄ£¬µ«ÊǶÔÓÚÓµÓÐͬһ¸ö½Ó¿ÚµÄ·ÇÊý×鼯ºÏ£¬¹¤×÷ÆðÀ´½«¸ü¼ÓÇ¿´ó¡£Ê¹Óà foreach ¿ØÖƽṹ·½Ê½µÄ¼¯ºÏȷʵ·Ç³£¿á¡£ SPL ʵÏÖÖÐ×î²»ÐÒµÄÎÊÌâÊÇÓëµü´úÆ÷¿ÉÄÜ´æÔÚµÄÃû³Æ¿Õ¼ä³åÍ»¡£ÓжàÉÙ PHP4 ÃæÏò¶ÔÏóµÄ´úÂëÓµÓÐÀàËÆÓÚµü´úÆ÷Àà×÷Ϊ¿âµü´úÆ÷ÀàµÄ»ùÀࣿÔÚһЩÈÝÁ¿ÖÐÓжàÉÙ 5 ÖÖ±ØÐè·½·¨µÄ¶¨Ò壿¿ÉÄÜÒ»¸ö¸ü¼Ó¾ßÓÐÉî¿Ìº¬ÒåµÄÃû³Æ¾ÍÄÜʵÏÖ Foreachable¡£Èç¹ûÄãÑ¡ÔñʹÓà SPL£¬Ôò»¹Ó¦¸ÃÑо¿ÆäËüÖ§³ÖµÄµü´úÆ÷£¬ÀýÈçRecursiveArrayIterator ºÍÆäËüÖÚ¶àµü´úÆ÷¡£
ÒÔÉÏËù·ÖÏíµÄÊǹØÓÚ¡¶PHPÉè¼ÆÄ£Ê½½éÉÜ¡·µÚ°ËÕ µü´úÆ÷ģʽ£¬ÏÂÃæÊDZà¼ÎªÄãÍÆ¼öµÄÓмÛÖµµÄÓû§»¥¶¯£º
¡¡¡¡Ïà¹ØÎÊÌ⣺ÄãÊìϤµÄÉè¼ÆÄ£Ê½ÓÐÄÄЩ£¿Ð´³öµ¥ÀýģʽµÄʵÏÖ´úÂë
¡¡¡¡´ð£ºÒ»¹²23ÖÖÉè¼ÆÄ£Ê½£¡ ÒýÓá¶Èí¼þÃØóÅ-Éè¼ÆÄ£Ê½ÄǵãÊ¡·Êé¼®£º °´ÕÕÄ¿µÄÀ´·Ö£¬Éè¼ÆÄ£Ê½¿ÉÒÔ·ÖΪ´´½¨ÐÍģʽ¡¢½á¹¹ÐÍģʽºÍÐÐΪÐÍģʽ¡£ ´´½¨ÐÍģʽÓÃÀ´´¦Àí¶ÔÏóµÄ´´½¨¹ý³Ì£»½á¹¹ÐÍģʽÓÃÀ´´¦ÀíÀà»òÕß¶ÔÏóµÄ×éºÏ£»ÐÐΪÐÍģʽÓÃÀ´¶ÔÀà»ò¶ÔÏóÔõÑù½»»¥... >>Ïêϸ
¡¡¡¡Ïà¹ØÎÊÌ⣺phpÉè¼ÆÄ£Ê½£¬µü´úÆ÷ģʽÎÞ·¨Àí½âµÄ²¿·Ö
¡¡¡¡´ð£ºÒªÊµÏÖIterator½Ó¿Ú£¬ÊµÏÖÎå¸ö·½·¨£¬current() key() next() rewind() valid() Á÷³Ì½ØÍ¼ÉÏÓÐ >>Ïêϸ
¡¡¡¡Ïà¹ØÎÊÌ⣺phpÉè¼ÆÄ£Ê½£¬µü´úÆ÷ģʽÎÞ·¨Àí½âµÄ²¿·Ö
¡¡¡¡´ð£ºÇ°ºó·½·¨Ãû²»Æ¥Åäisdone-----isDone ²»¶àÓ࣬ͨ¹ý¸Ã·½·¨¿ÉÖªÊÇ·ñÒѾ±éÀúµ½ÈÝÆ÷µÄµ×£¬ÕâÑù¿ÉÒÔ·½±ã±éÀúÕû¸öÈÝÆ÷¡£ ¾ÍÏó¶ÁÎļþÒ»Ñù£¬ÐèÒªÓÐÒ»¸öfeofÀ´ÅжÏÊÇ·ñÒѾ¶Áµ½ÁËÎļþβ²¿¡£ >>Ïêϸ
- ÆÀÂÛÁÐ±í£¨ÍøÓÑÆÀÂÛ½ö¹©ÍøÓѱí´ï¸öÈË¿´·¨£¬²¢²»±íÃ÷±¾Õ¾Í¬ÒâÆä¹Ûµã»ò֤ʵÆäÃèÊö£©
-
