PHPã«ã¯5.0.0以éSPL (Standard PHP Libray)ã¨ããæ çµã¿ãå°å ¥ããã¦ãã¾ããããã«ãããIteratorインターフェースãå®è£ ããã¯ã©ã¹ã®ã¤ã³ã¹ã¿ã³ã¹ã§ããã°ãforeachæã§é åã¨åãããã«åãæ±ãã¾ããèªåã§ã¯ã©ã¹ãä½ãã¨ããIteratorãå®è£ ããã°ä½¿ãã®ã楽ã§ãããã³ã¼ããèªã¿ããããªãã¨æãã¾ãã
ã¾ããPHPã«æ¨æºã§çµã¿è¾¼ã¾ãã¦ããã¯ã©ã¹ã«ã¯Iteratorãå®è£ ãã¦ãããã®ãå¤æ°ããã¾ãããã¨ãã°åã®æå ã®PHP5.2.9ã«ã¯24åã®ã¤ãã¬ã¼ã¿ãããããã®ãã¡ããã¤ãã¯ååã«å®ç¨çãªã¯ã©ã¹ã§ãããã ãæ¥æ¬èªã®è³æãå°ãªãããããããªãç¥å度ã¯ä½ãããã«æãã¾ããæ¬è¨äºã§ã¯4ã¤ã®ä¾¿å©ãªçµã¿è¾¼ã¿ã¤ãã¬ã¼ã¿ãç´¹ä»ãã¾ãã
SPLã®ã¯ã©ã¹ã«ã¯ãã¶ã¤ã³ãã¿ã¼ã³ã®èããå¤ãå«ã¾ãã¦ãã¾ããç¹ã«ãã¤ãã¬ã¼ã¿ãå
ã«ã¤ãã¬ã¼ã¿ãä½ããããªä½¿ãæ¹ã¯ãä¿å®æ§ã®é«ãã·ã³ãã«ãªã³ã¼ããæ¸ãä¸ã§ãã³ãã«ãªãã¨æãã¾ãã
SplFileObjectï¼ãã¡ã¤ã«ã®å 容ã1è¡ã¥ã¤è¿ãã¤ãã¬ã¼ã¿
SplFileObjectã¨ããã®ã¯ãæ¬æ¥ã¯ãã¡ã¤ã«æä½é¢æ°ã®ä»£ããã«ãªãã¸ã§ã¯ãæå風ãªæä½ãæä¾ããã¯ã©ã¹ã§ãPHP5.1.0以éã§ä½¿ãã¾ããä»åã¯ã¤ãã¬ã¼ã¿ã¨ãã¦ä½¿ã£ãã¨ãã®æ©è½ã«æ³¨ç®ãã¦ã¿ã¾ãã
<?php $inputs = new SplFileObject(__FILE__, 'r'); foreach($inputs as $line) { print $line; }
ãã®ã¤ãã¬ã¼ã¿ã¯ããã¡ã¤ã«ã®å
容ã1è¡ã¥ã¤è¿ãã¾ããããã使ãã°Perlã®ãããªããªã§ãã£ã«ã¿ããã°ã©ã ãæ¸ãããã§ãããã
NoRewindIteratorï¼Rewindã§ããªãã¤ãã¬ã¼ã¿ãforeachã§ä½¿ã
ã¨ããã§ãSplFileObjectãå®éã«ä½¿ã£ã¦ã¿ãã¨ãä¸ã¤åé¡ç¹ã«æ°ã¥ãã¾ãã'php://stdin'ã«å¯¾ãã¦ã¤ãã¬ã¼ã¿ããã¾ãåããªããã¨ãããã®ã§ãã
<?php $inputs = new SplFileObject("php://stdin"); foreach($inputs as $line) { print $line; }
ä¸è¨ããã°ã©ã ã¯ä¸è¨ã®ãããªä¾å¤ãçºçãã¾ãã
$ echo hoge | php stdin-rewind-failure.php PHP Warning: SplFileObject::rewind(): stream does not support seeking in /tmp/stdin-rewind-failure.php on line 3 PHP Fatal error: Uncaught exception 'RuntimeException' with message 'Cannot rewind file php://stdin' in /tmp/stdin-rewind-failure.php:3 Stack trace: #0 /tmp/stdin-rewind-failure.php(3): SplFileObject->rewind() #1 {main} thrown in /tmp/stdin-rewind-failure.php on line 3
ããã¯ã©ããããã¨ã§ãããããã¤ãã¬ã¼ã¿ãforeachã§ä½¿ãã¨æåã«å¿
ãrewind()ãå¼ã°ãã¾ããããããæ¨æºå
¥åã«ã¯å®ä½ãã¡ã¤ã«ãããããã§ã¯ããã¾ãããrewind()ã§ãã¡ã¤ã«å
é ã«å·»ãæ»ããã¨ãä¸å¯è½ã¨ãããã¨ã§ãä¾å¤ãçºçãã¦ããããã§ãã
ãããªã¨ãã«NoRewindIteratorãå©ç¨ã§ãã¾ããããã¯ãæ¢åã®ã¤ãã¬ã¼ã¿ã®rewindãå¼ã°ãªãããã«ããã¤ãã¬ã¼ã¿ã§ãã
<?php $inputs = new NoRewindIterator(new SplFileObject("php://stdin")); foreach($inputs as $line) { print $line; }
NoRewindIteratorãå©ç¨ãããã¨ã§ãæ¨æºå
¥åããã¡ã¤ã«åæ§ã«ã¤ãã¬ã¼ã¿ã¨ãã¦æ±ããããã«ãªãã¾ããã
AppendIteratorï¼è¤æ°ã®ã¤ãã¬ã¼ã¿ãçµåãã
AppendIteratorãæ¢åã®ã¤ãã¬ã¼ã¿ã®æåãå¤æ´ããã¤ãã¬ã¼ã¿ã§ãè¤æ°ã®ã¤ãã¬ã¼ã¿ãä¸ã¤ã®ã¤ãã¬ã¼ã¿ã®ããã«æ±ãã¾ããå
·ä½çã«ã¯ã1ã¤ç®ã®ã¤ãã¬ã¼ã¿ã®æå¾ã®è¦ç´ ã¾ã§å°éããã¨2ã¤ç®ã®ã¤ãã¬ã¼ã¿ã®å
é è¦ç´ ãè¿ãã¾ãã
<?php $inputs = new AppendIterator(); $inputs->append(new SplFileObject('example1.txt', 'r')); $inputs->append(new SplFileObject('example2.txt', 'r')); foreach($inputs as $line) { print $line; }
ãã®ããã«ãè¤æ°ãã¡ã¤ã«ã®å
容ãé£çµãã¦1ã¤ã®ã¤ãã¬ã¼ã¿ã¨ãã¦å¦çãããããªã©ã¨ããã¨ãã«ã¯SplFileObjectã2ã¤ä½ããAppendIteratorã§ä¸ã¤ã®ã¤ãã¬ã¼ã¿ã¨ãã¦æ±ããã¨ãã§ãã¾ãã
This is Example1. HELLO 12345 bye This is Example2. 678foo 0
ãã®ããã«ããcat example1.txt example2.txtãã¨åãçµæãå¾ããã¾ããã
RegexIteratorï¼æ£è¦è¡¨ç¾ããããè¡ãã¤ãã¬ã¼ã¿
æ¢åã®ã¤ãã¬ã¼ã¿ããæ°ããã¤ãã¬ã¼ã¿ãä½ããã¨ããèãã«æ
£ãã¦ããã®ã§ã¯ãªãã§ãããããæå¾ã«ç´¹ä»ããã¤ãã¬ã¼ã¿ã¯RegexIteratorã§ããããã¯ãæ¢åã®ã¤ãã¬ã¼ã¿ããæ¡ä»¶ã«åãè¦ç´ ã ããåãåºãã¤ãã¬ã¼ã¿ã§ãã
<?php $inputs = new AppendIterator(); $inputs->append(new SplFileObject('example1.txt', 'r')); $inputs->append(new SplFileObject('example2.txt', 'r')); $filtered_inputs = new RegexIterator($inputs, '/^\d*$/'); foreach($filtered_inputs as $line) { print $line; }
å
ã»ã©ä¾ã¨ãã¦ä½¿ã£ãAppendIteratorã«RegexIteratorãé©ç¨ãã¾ããã
12345 0
çµæã¯ä¸è¨ã®ããã«ã2ãã¡ã¤ã«ã®å
容ã®ãã¡ãæ£è¦è¡¨ç¾ã«ãããããè¡ã ãã表示ããã¾ããAppendIteratorãå
ã«ãæ£è¦è¡¨ç¾ã«ãããããè¡ã ããè¿ããããªã¤ãã¬ã¼ã¿ãä½ãããããã§ãã
ããã¯ã³ãã³ãããã¤ãã§ã¤ãªãã®ã«è¿ãæè¦ã§æããããã¨æãã¾ããä¸ã®çµæã¯ãcat example1.txt example2.txt | grep '^[0-9]*$'ãã¨åãã§ãããã
ã¾ã¨ã
- SplFileObjectãç´¹ä»ãã¾ãããããã¯ããã¡ã¤ã«ãã¤ãã¬ã¼ã¿ã¨ãã¦æ±ãã¾ãã
- ã¤ãã¬ã¼ã¿ãå
ã«å¥ã®ã¤ãã¬ã¼ã¿ãä½ããããªçµã¿è¾¼ã¿ã®ã¤ãã¬ã¼ã¿ã3ã¤ç´¹ä»ãã¾ããã
- ãããã¯ãããããã¤ãã¬ã¼ã¿ã®æåãåãä»çµã¿ã§å¤æ´ãããã¨ãã§ãã¾ãã
- PHPã§ããã¶ã¤ã³ãã¿ã¼ã³ã¯ç解ã®å©ãã«ãªãã¾ãã
- ä¾ãã°ãNoRewindIteratorã¨RegexIteratorã¯ã¤ãã¬ã¼ã¿ã«å¯¾ããDecorator Patternã«ãªã£ã¦ãã¾ãã
çµã¿è¾¼ã¿ã¤ãã¬ã¼ã¿ã®ä¸ã«ã¯ãä»ã«ãæ°ã«ãªãã¯ã©ã¹ãã¡ã½ãããããããããã¾ããä»ã«é¢ç½ããã®ãè¦ã¤ãã人ã¯æ¯éæãã¦ãã ãããã¾ããå¤æ°ã®ã¯ã©ã¹ãã¤ã³ã¿ã¼ãã§ã¼ã¹ãé¢ä¿ãã¦ããã®ã§ãããã¯ãã¶ã¤ã³ãã¿ã¼ã³ã§è¨ãã¨ä½ããªãã¨èããã®ãé¢ç½ãã¨æãã¾ãã
æå¾ã«ãSPLã®æ¦è¦ãææ¡ããä¸ã§é常ã«åªããè³æãå ¬éããã¦ãã¾ãã®ã§ãç´¹ä»ãã¾ãã2007å¹´12æã«éå¬ãããPiece Network 1ã§é¢å±±ãããçºè¡¨ããããSPL入門 - SPLで学ぶPHP5のオブジェクト指向 -ãã§ããæ¬è¨äºã®4ã¤ã®ã¤ãã¬ã¼ã¿ãå«ãç¶²ç¾ çãªè§£èª¬ãããã¾ãã®ã§ãPHP使ããªãä¸åº¦ã¯è¦ã¦ããã¹ãã ã¨æãã¾ãã