pirosikick's diary

君のハートにunshift

PHP5.4のClosure::bindToを使ってJavaScriptのクロージャもどき作った

PHP5.4からClosure::bindToClosure::bindというのが追加されている。

これは何かというと、JavaScriptで言うところのFunction.prototype.callみたいな感じで、無名関数に対してオブジェクトを割り当てることができ、その無名関数をそのオブジェクトのメソッドと同等のスコープで実行できるようにする。

<?php

/**
 * 適当にクラスを定義
 */
class Hoge
{
    private $_hoge = "hoge";
}

/**
 * 無名関数を定義
 */
$function = function () {
    var_dump($this->_hoge);
};

/**
 * Hogeクラスのインスタンスをbind
 */
$function = $function->bindTo(new Hoge());

$function(); // string(4) "hoge";

PHP5.3で同じようなことをしようと思うとuseキーワードを使って静的に行う必要があったので、それが動的にできるというのは結構いいかもしれない。

本題

で、ちょっと遊んでみようと思ってJavaScriptのクロージャもどきを作ったんだけど、誰得なんだよwwwと一人でニヤニヤしてしまったので久々にブログを書きました。