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 回 オブジェクト・インターフェースに関する変更が参考になります。

twk, 12月 31st, 2008 at 15:05 [コメント]

「その他のものはドキュメントの一環として、C言語で実装された後にPHPで実装されている」
PHPでの実装を書いておくと、PHPは得意だけどCは苦手、と言う人が理解できるよね、と言う意味で、ドキュメントの代わりになると言うことではないでしょうか。
二度手間な気もしますが、ここであげている、古いPHPで使われることも考慮に入れているのでしょう。

tksh, 12月 31st, 2008 at 15:31 [コメント]

その他のものはドキュメントの一環として、C言語で実装
された後にPHPで実装されている(訳注:この一文の言わ
んとしていることが汲み取れませんでした)。

SPL の新しいデータ構造は、先にある通り、C言語で実装されているので速いよ、というのがウリの一つですね。それに対する想定反論として「昔のバージョンの PHP じゃ使えないじゃん」『でも PHP での実装も作ってあるから安心して』っていうコトだと思います。

juno, 1月 1st, 2009 at 05:38 [コメント]

twkさん、tkshさん

お二人の見解を合わせたようなニュアンスという感じでよさそうですね。
コメントありがとうございました。