2008/02/02

php:関数に変数をバインドしたい

2008/02/02 土曜日 - 03:38:00 by decama

prototype.jsを使うようになって、bindがとても便利なことに気づかされたんだけれども、これと同様のことをphpでやろうと思った時に、どうすればいいのか考えなきゃならなくなった。
Smartyが使えるかどうかわからないサーバに、テンプレートを使わなきゃいけないような実装をしなければならなかったので、
preg_replace_callbackを使って変数をパースさせようとしてみた。コールバック関数側でアサイン用の配列を参照してパースすればいいじゃん、と思って組んでみた。
ところが、コールバック関数には、正規表現にマッチした文字列が配列で投げられるだけで、他に参照用の配列を渡せない。
コールバック関数側で、参照用配列をglobalでアクセスすればいいんだけど、これだと美しくない。
で、こうしてみた。

class Binder
{
    var $bind;
    function __construct($arg = NULL)
    {
        if (!is_null($arg)) $this->bind = $arg;
    }
    function __call($foo, $args)
    {
        array_unshift($args, $this->bind);
        return call_user_func_array($foo, $args);
    }
}

コールバック関数が呼ばれる前に、

$bind = new Binder($assigned);

みたいにバインドさせる変数を事前に渡しておいてから、コールバック関数を

array($bind, "myfunc")

で呼び出せば、バインド用に渡しておいた変数を一緒に投げてくれる。
無理やりな解決策だったけど、これはもうちょっと考えてあげれば面白いかもしれないのでとりあえずのメモ。