第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 |
list1 |
0:10000 |
結果 |
$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の使い手が白熱した議論を行った |
|
- プログラムの実行はどのようにして行われるのか、Linuxカーネルのコードから探る (2017/7/20)
C言語の「Hello World!」プログラムで使われる、「printf()」「main()」関数の中身を、デバッガによる解析と逆アセンブル、ソースコード読解などのさまざまな側面から探る連載。最終回は、Linuxカーネルの中では、プログラムの起動時にはどのような処理が行われているのかを探る - エンジニアならC言語プログラムの終わりに呼び出されるexit()の中身分かってますよね? (2017/7/13)
C言語の「Hello World!」プログラムで使われる、「printf()」「main()」関数の中身を、デバッガによる解析と逆アセンブル、ソースコード読解などのさまざまな側面から探る連載。今回は、プログラムの終わりに呼び出されるexit()の中身を探る - VBAにおけるFileDialog操作の基本&ドライブの空き容量、ファイルのサイズやタイムスタンプの取得方法 (2017/7/10)
指定したドライブの空き容量、ファイルのタイムスタンプや属性を取得する方法、FileDialog/エクスプローラー操作の基本を紹介します - さらば残業! 面倒くさいエクセル業務を楽にする「Excel VBA」とは (2017/7/6)
日頃発生する“面倒くさい業務”。簡単なプログラミングで効率化できる可能性がある。本稿では、業務で使うことが多い「Microsoft Excel」で使えるVBAを紹介する。※ショートカットキー、アクセスキーの解説あり
|
|