[php]PHP5のSPLのArrayObjectでGenericsな配列を作る
普段はスルーしているZend Developer ZoneのRSSなのですが、ふと目に止まった記事があったので紹介しようかと思います。
Generic arrays in PHP
http://blog.maartenballiauw.be/post/2007/10/Generic-arrays-in-PHP.aspx
PHP5から使えるようになったSPL(Standard PHP Library)の中にArrayObjectクラスという配列を扱うクラスがありますが、それを継承してゴニョゴニョすることで、ジェネリクス(ジェネリック?)な配列、つまりJavaでいうArrayList<SomeClass>な感じを再現しようではないかと言うブログの内容です。ブログ自体は読みやすい英語で、きれいなクラス図もあり、ソースコードを読むだけでもどういうアプローチでやろうとしているのかがすぐにわかると思います。
よくできているなと思ったのは、phpのプリミティブな型(stringやint)の配列を扱う方法も書いてあるところです。JavaであればStringクラスやIntegerクラスがあるので、そのままジェネリクスとして指定すればいいけれども、phpではクラスではなくプリミティブ型なので、そういった型を使えるように拡張したArrayObjectクラスの作り方も書いてあります。
具体的には、ArrayObject::apend()やArrayObject::offsetSet()の引数としてクラス名を指定して他の型が入るのを防ぐのではなく、append()やoffsetSet()をしようとした仮引数に対して予め指定したバリデーション関数を掛けて、他の値が入るのを防ぐということみたいです。つまり、バリデーション関数にis_string()を指定すればプリミティブなstringのみを扱うArrayObjectになり、is_int()を指定すればintのみを扱うArrayObjectになり、
-
// Validation function
-
function is_class_example($value) {
-
return $value instanceof Example;
-
}
のような関数を指定すれば、特定のクラスのみを扱うArrayObjectになる、という寸法です。
php5になって、SPLが導入されたはいいけど、いまいちそのノウハウが出回ってないですよね(と、こないだPHP勉強会で安藤さんが言ってたような気がします)。こういったSPL関連の記事がもっと増えると良いですね。
※ちなみに、ソースを目視しただけなので、間違ってることを載せているかもしれません。そのときはメールでこっそりとは言わず、ブログ上でぶったたいてもらってかまいません。自分が未熟なだけですから。「うえちょこはジェネリクスについて語らないほうがいいのでは」的に(笑。いつかバッシングされてみたいです(ぉぃ。