PHPでプロトタイプベースのオブジェクト指向をやってみる

PHPにはstdClassというものがあって、これを使うとオブジェクトを生成後にインスタンス変数を追加したりできます。以下サンプル

$obj = new stdClass();
$obj->hoge = "hogehoge";

echo $obj->hoge

まぁこんな感じです。
PHP5.3からは無名関数が導入され、変数に関数が入れられるようになりましたが、気になるのはこの無名関数がstdClassにセットできるかどうかと言う事ですね!
というわけで試してみました

$obj = new stdClass();
$obj->hoge = "hogehoge";
$obj->mumei = function(){
    echo "mumei";
};  #無名関数のこのセミコロンをいっつも忘れる

$obj->mumei()

とりあえず上記のように直感的に試してみた。
そしたら以下のようなエラーが出た。

PHP Fatal error: Call to undefined method stdClass::mumei()

ぐぬぬ。定義してるはぼけ!と言いたくなったけど、とりあえず$objをvar_dumpしてみた

object(stdClass)#1 (2) { ["hoge"]=> string(8) "hogehoge" ["mumei"]=> object(Closure)#2 (0) { } }

Closureってオブジェクトなんか見た事無かったけど、たぶんPHP5.3から追加された無名関数のなんかだろう。ひとまずうまくいっているようには見える。呼び出せないけど
と、ここでPHPは new Hoge()->hoge()のように使えない事を思い出したので、以下の用に書いてみた

$f = $obj->mumei;
$f()

これで動きました
ちなみにこれでも動きました

call_user_func($obj->mumei);

PHP で引数をそのまま返す関数を作っておくと便利 - IT戦記を参考にすると、もうちょっとスマートに書けそうです。

まとめ

というわけで、PHP5.3の無名関数とstdClassを使えば、プロトタイプベースっぽく書けるようです。
みんな使ってみて、PHPをよりカオスなダメな子にしましょう!!!