件名:

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トピックには下記のMLトピックがレス(返信)されています:
[DP/ML:1006] Re: Iterator patterns in PHP4  (Hideto ISHIBASHIさん)
 読み込み 中...
<<1004:Re: Iterator patterns in Ruby 1006:Re: Iterator patterns in PHP4>>
MLトピック表示
切替 トピック表示 メール表示
MLトピック一覧

MLトピック検索:
MLトピックの詳細(メール表示)
MLトピック表示
  切替 トピック表示 メール表示
MLトピック一覧

メーリングリストでつながる!ひろがる!みんなのHappyコミュニティ!

詳細検索
NOEMBLEM/エンブレムが設定されていません。
デザインパターン・メーリングリスト (3966)
 
27 28 29 30 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
メンバーリストは非公開です。
メンバーの日記/フォト/動画
メンバーの投稿は非公開です。
 読み込み中...