第3回 「SPL」でイテレーションを使いこなす

亀本 大地
アシアル株式会社

2008/10/07

PHP4のサポートが終了し、これまでPHP4が中心だった開発現場でも、いよいよPHP5への移行を視野に入れる時期が来た。PHP5ならではの機能を生かした開発を進めるためのポイントを紹介する(編集部)

 第2回「『SimpleXML』と『JSON』で共通データ形式を便利に」では、PHP5から追加されたSimpleXML、JSON、PDOといった拡張モジュールを紹介した。

 今回は、PHPの標準プログラミングインターフェイス「SPL(Simple PHP Library)」について紹介する。

 

 

 

 

 

標準PHPライブラリ「SPL」

 SPLとは、プログラミング中によく遭遇する問題を解決するのに便利なインターフェイスやそれを実装したクラスの集合ライブラリのことだ。

 その中心的な存在となるのは、イテレーションを実装するための方法を提供するインターフェイス群で、非常に大きな生産性を与えてくれる。また、このSPLで提供されるインターフェイスを用いて実装されたクラス群も併せて用意されており、これらもうまく使うことで大変便利なものとなる。

 SPLには非常にさまざまなインターフェイスやクラスが用意されている。以下に代表的なインターフェイスとその実装クラスの一覧をまとめる。

Iterator イテレーションを行う方法を提供するインターフェイス
IteratorAggregate 外部イテレータを呼び出すインターフェイス
ArrayAccess オブジェクトに対して配列演算子によるアクセス方法を提供するインターフェイス
表1 代表的なインターフェイス

ArrayObject オブジェクトに対して配列演算子を使ってアクセスする
ArrayIterator ArrayObjectの外部イテレータ
SimpleXMLIterator XMLから要素を抽出する
DirectoryIterator 指定したパスからファイルやディレクトリの情報を取得する
RecursiveDirectoryIterator 指定したパスからファイル・ディレクトリ情報を再帰的に取得する
表2 代表的な実装クラス

 ここに挙げた以外にも、例外クラスなどを中心に数多くの種類がある。このほかのSPLクラス群の詳細について知りたい場合は、「SPL - Standard PHP Library」を参照するとよい。

関連リンク:
リンク SPL - Standard PHP Library
http://www.php.net/~helly/php/ext/spl/

Iteratorインターフェイス

 まず、SPLで最も代表的かつ利用価値が高いといえるIteratorインターフェイスとIteratorAggregateインターフェイスについて順を追って説明していく。

 イテレータとは反復子とも呼ばれ、オブジェクトの持っているコレクションに対してある一定の処理を繰り返しながら順次アクセスしていくような実装のことである。

 PHP4では、イテレータのようなものとしてPHP自身が用意していた機能にforeachがあった。これを使うことでプロパティへの順次アクセスが行えたが、foreachは単にオブジェクトのコレクションを呼び出しているにすぎず、そのデータを加工する処理をループ内に記述する必要があった。

 PHP5からは、Iteratorインターフェイスを利用することで、特定の処理を繰り返し行った結果を返すといったロジックを、ループ内から切り離してオブジェクト側に実装できるようになった。

 非常に簡単な例として、与えた配列の要素を任意の指数で2乗して返すようなイテレータの実装を見てみよう。

<?php
class Square implements Iterator
{
  private $roots;

  public function __construct($roots) {
    $this->roots = $roots;
  }

  public function rewind() {
    return reset($this->roots);
  }
  public function current() {
    return pow(current($this->roots), 2);
  }

  public function key() {
    return key($this->roots);
  }

  public function next() {
    return next($this->roots);
  }

  public function valid() {
    return (false !== current($this->roots));
  }
}

$data = array(100, 200, 300);
$square = new Square($data);

foreach ($square as $key => $val) {
  echo $key . ':' . $val . PHP_EOL;
}
var_dump($square);
list1

0:10000
1:40000
2:90000
object(Square)#1 (1) {
  ["roots:private"]=>
  array(3) {
    [0]=>
    int(100)
    [1]=>
    int(200)
    [2]=>
    int(300)
  }
}
結果

 $rootsプロパティに対して配列を渡すことで、foreachループ内の$valに対してその2乗した結果が順次渡されていることが分かる。Iteratorインターフェイスを利用することで、このように任意の操作を行った形で値を取得できる。

 Iteratorインターフェイスには、イテレーションの役割ごとに、以下の5つのメソッドが定義されている。

rewind() 内部ポインタを初期化
current() ポインタが指す現在の位置の値を取得
key() 現在の位置のキーを取得
next() ポインタを次の位置へ移動
valid() 現在の位置が有効かどうかを判定
表3 Iteratorインターフェイスのメソッド

 各メソッドはforeachでのアクセスの際に自動的に呼び出されるようになっており、これらのメソッドに対してそれぞれ適切な処理を記述することでイテレータを実装できる。もちろん、forやwhileなどを利用する場合でも、明示的に各メソッドを呼び出すことで同様の処理が可能だ。

 
1/2

Index
「SPL」でイテレーションを使いこなす
Page1
標準PHPライブラリ「SPL」
Iteratorインターフェイス
  Page2
Iteratorインターフェイスを使うメリット
IteratorAggregateインターフェイス
ArrayObject/ArrayIteratorクラス

PHP5で広がる! 開発環境

 PHP関連記事
例外処理の実装を把握する
PHP5で広がる! 開発環境(1)
 PHP4のサポートが終了し、いよいよPHP5への移行を視野に入れる時期が来た。PHP5の機能を生かした開発のポイントを紹介
クライアントPCに言語環境を入れる理由
Mac OS X+PHPでオールインワン環境(準備編)
 Webアプリ開発者に人気のMac OS X。効率的な開発のために複数バージョンのPHPを実行する環境を構築してみよう
PHPに押し寄せるリスクと国際化の波
PHPカンファレンス2008レポート(前編)
 PHP4のサポートが完全に終了する。多くの新機能が投入されるPHP5.3へ移行か、国際化対応で開発が遅れるPHP6を待つか
PHPによる大規模商用サービスの裏側
PHPカンファレンス2008レポート(中編)
 企業のWebアプリケーション開発現場で利用されるPHP。開発現場の裏側にはさまざまなドラマが隠されている
PHPユーザーは本当にほかの言語を知らないのか?
PHPカンファレンス2008レポート(後編)
 PHPは本当にダメな言語なのだろうか。Perl、Ruby、Python、Java、JavaScriptの使い手が白熱した議論を行った
  Coding Edgeフォーラムフィード  2.01.00.91


Coding Edge フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

>

Coding Edge 記事ランキング

本日 月間