きっかけ
アルゴリズム百選 – 配列を再発明するという、JavaScriptのArrayを独自のオブジェクトで再実装する記事を読んで、同じことをPHPでやったらどうなるか試してみました。
結果
https://github.com/ryo-utsunomiya/JsArray
使い方
$fruits = new MyArrayJsArray("Banana", "Orange", "Lemon", "Apple"); $fruits[] = "Mango"; echo $fruits->pop(); // "Mango" $citrus = $fruits->slice(1, 3); echo $citrus[0]; // "Orange"
より詳細な使い方はテストを見るとよいかも。
作り方
PHPにはArrayAccessというインターフェースがあります。これを実装すれば、オブジェクトのプロパティに対して、配列と同じ記法でアクセスできるようになります。基本的な機能はこのインターフェースを実装すればOKで、あとはMDNのリファレンスを参考にメソッドを実装していきました。
get/set/pop/push/shift/unshift/toArrayはアルゴリズム百選 – 配列を再発明するの実装を参考に(というかほとんど丸写しで)実装しました。あと、実は参考実装に1点バグに近い挙動(spliceで削除されたはずの値がオブジェクトに残ってしまう)があり、この点は私の実装でも未修正の状態です。
EcmaScriptの仕様に完全準拠というわけでもなく、未実装部分やズルをしている部分もあったりしますが、とりあえず現状できたところまでで上げてしまおうかな、と。主な宿題は、sort/mapあたりの実装と、shift/unshiftの書き直しです。
こんなの何の役に立つの? と思われそうな感じですが、役に立ったところは (1) PHPのArrayAccessとcloneの使い方をちゃんと理解できた (2) JavaScriptのArrayの仕様を理解できた の2点ですね。特に(2)は大きかったです。