PHP 5.3の新しいSPLデータ構造クラス

PHP 5.3のリリースマネージャ、Johannes Schlüterさんのブログの「A hidden gem in PHP 5.3」シリーズ第二弾、SPLの新しいデータ構造クラスについて。


Data structures in PHP 5.3 – Johannes Schlüter

5.3の新機能に関するシリーズの第二弾では、Etienne Kneussのデータ構造実装について取り上げようと思う。

プログラミングの世界にはよく知られたいくつかのデータ構造がある。それらは多くのアプリケーションで普通に使われているが、PHPは5.3に至るまでデータ構造として配列(言い換えるならハッシュテーブル)とオブジェクトしか提供していなかった。従って人々はそれを非難するか、既存のデータ構造の上に自分自身で構造を実装するかしていた。Etienneのおかげで事態は変わり、PHPのStandard PHP Library (SPL)拡張モジュールがいくつかの基本的なデータ構造を提供するようになった。データ構造は以下のクラスを用いて実装されている。

  • SplDoublyLinkedList
  • SplStack
  • SplQueue (SplPriorityQueue)
  • SplHeap (SplMinHeap, SplMaxHeap)
  • SplFixedArray

SplFixedArray以外のクラスについては、どんなものかは明確だと思う。わからないものがあれば、Wikipediaやプログラミングの入門書を読めば説明があるだろう。的確なネーミングとPHPの場合の実装についてはマニュアルが参考になる。さて、ではなぜ自分で実装するよりもこれらのクラスを使うべきなのだろうか?色々と理由はあるが特に重要なのは次の点だ。

  • 他の誰かが済ませてしまったことをまた繰り返す必要があるのか?ー多くの箇所で使われているコードはテストされておりバグも少ない
  • C言語で実装されたコードはPHPユーザーランドのものよりも高速である
  • デフォルトのデータ構造を使うことでコードのメンテナンス性が高まる

それでも残る疑問はある。「わかった。そいつはナイスだしクールだし、使ってみてもいい。ただ、しばらくは古いバージョンのPHPもサポートしなくちゃならないんだ。どうすればいい?」 簡単な解決策がある。 SPLの大部分はC言語で実装する必要のある特別なトリックを使っているわけじゃないから、ユーザーランドで実装することだってできる。 実際、たいていのコードは良いインターフェースを設計するためにまずユーザーランドのコードとしてテストされている。 その他のものはドキュメントの一環として、C言語で実装された後にPHPで実装されている(訳注:この一文の言わんとしていることが汲み取れませんでした 「こういう意図ではないか」というコメントを頂きましたのでコメント欄を参照してください)。 そうした実装はPHPのソースリリースやCVSを通じて配布されているので、それを持ってきて使うこともできる。

さて、用途がよくわからなかったクラス SplFixedArrayに話を戻そう。SplFixedArrayはPHPの配列に近いが大きな制約を持ったデータ構造実装である。その制約とは、あらかじめ定義された範囲(0から任意の正の値まで)の数値しか添字にできないということで、ベースとなっている5.2のArrayObjectと似ている。PHPが提供する多くの配列関数と共に使うことはできないが、その提供する範囲内・機能内での速度はとても速く、従来の配列に比べてメモリ消費も少ない。数値の添字だけでも問題ない巨大な配列を扱う際には使ってみて欲しい。

訳注;SplFixedArrayの使い方についてはPHP V5.3 では何が新しいのか: 第 1 回 オブジェクト・インターフェースに関する変更が参考になります。