| 件名: | Iterator patterns in PHP4 |
|---|---|
| MLNo. | [DP/ML:1005] |
| 差出人: | TAKAHASHI Masayoshiさん |
| 送信日時: | 2001/09/18 12:15 |
| 本文: | 高橋正義です。
イテレータのサンプルですが、PHP4版も作ってみました。 PHPは、arrayが順序つきHash(?)である、という何かがすごい言語で、 array自体はクラスではないため、継承ではなく委譲する使い方に なります。 また、arrayにはnextという、要素を一つずつ取り出す関数がある のですが、これは「arrayの要素がもうない時」と「要素がFALSE だった時」の区別をしないらしいので、eachという関数が推奨 されているようです(「PHPマニュアル」より)。 each関数は、左辺が list($foo, $bar) となっていると、 $fooにキーが、$barに値が入ります(いや、だからarrayはハッシュ なんです……)。そして、arrayの最後まで来たときにはeach関数は FALSEを返します。 <?php // Iterator Smaple class Book { var $name; function Book($name) {$this->name = $name;} } class BookShelf { var $books; function BookShelf() {$this->books = array();} function book_at($index) {return $this->books[$index];} function append_book($book) {array_push($this->books, $book);} function length() {return size($this->books);} function iterator() {return new BookShelfIterator($this);} } class BookShelfIterator { var $bookShelf; function BookShelfIterator($bookShelf) { $this->bookShelf = $bookShelf; reset($this->bookShelf->books); } function next() { return each($this->bookShelf->books); } } // main $bookShelf = new BookShelf(); $bookShelf->append_book(new Book("Around the World in 80 days")); $bookShelf->append_book(new Book("Bible")); $bookShelf->append_book(new Book("Cinderella")); $bookShelf->append_book(new Book("Daddy-Long-Legs")); $it = $bookShelf->iterator(); while (list($pos, $book) = $it->next()) { print $book->name."<br>n"; } ?> また、PHP4にはarray_walkという、配列の要素一つずつに関数を適用して くれる関数があります。これと匿名関数を使えば、以下のようにも 書けます。 BookShelfIterator の iterate というメソッドがイテレータを実行 するためのメソッドで、これの引数は匿名関数、またはユーザ関数の 関数名です。create_functionの引数は、一つ目が匿名関数の引数、 二つ目が匿名関数の定義(を文字列で表したもの)です。 このようにすれば、PHP4でインターナルイテレータを実装できます。 <?php //Iterator Sample 2 // BookクラスとBookShelfクラスは上と同じなので省略 class BookShelfIterator { var $bookShelf; var $func; function BookShelfIterator($bookShelf) { $this->bookShelf = $bookShelf; } function iterate($func){ reset($this->bookShelf->books); array_walk($this->bookShelf->books, $func); } } // main $bookShelf = new BookShelf(); $bookShelf->append_book(new Book("Around the World in 80 days")); $bookShelf->append_book(new Book("Bible")); $bookShelf->append_book(new Book("Cinderella")); $bookShelf->append_book(new Book("Daddy-Long-Legs")); $it = $bookShelf->iterator(); $it->iterate(create_function('$book','print $book->name."<br>n";')); ?> 高橋征義 (TAKAHASHI Masayoshi) Email:maki@… |
|---|---|
| 設定タグ: | |
| 添付: |
このMLトピックには下記のMLトピックがレス(返信)されています:
読み込み
中...| <<1004:Re: Iterator patterns in Ruby | 1006:Re: Iterator patterns in PHP4>> |










