NOEMBLEM/エンブレムが設定されていません。

メールの詳細(メール表示)

件名:

Iterator patterns in PHP4

差出人: TAKAHASHI Masayoshiさん
送信日時 2001/09/18 12:15
ML.NO [DP/ML:1005]
本文:

高橋正義です。

イテレータのサンプルですが、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@…

添付:
 読み込み中...

このメールには下記のメールが返信されています:

【PR】壁紙ブログ無料ホームページ予定調整ゲーム