カテゴリー : closure

このカテゴリーの登録数:1件 表示 : 1 - 1 / 1

2006/03/27

PHPでクロージャ

ポスト @ 5:03:15 , 修正 @ 2006/03/27 12:04:47 | ,     

PHPのcreate_functionでクロージャできるんじゃないかな。と思って書いてみた。
そもそもクロージャについて詳しく理解してないけど、PHPでやるならこんな感じでしょうか

class closure {

    protected $sum = 0;

    public function fib($n){
        $this->sum++;
        if($n == 0){
            return 0;
        } else if($n == 1){
            return 1;
        } else {
            return $this->fib($n - 1) + $this->fib($n - 2);
        }
    }

    public function calling(){
        return $this->sum;
    }

    public static function create(){
        return new closure;
    }

    public function __clone(){
        $this->sum = 0;
    }
}

function func(){
    return create_function('', '
            static $closure;
            $n = func_get_arg(0);
            if($closure === null){
                $closure = closure::create();
            }
            return "fib :" . $closure->fib($n) . "(" . $closure->calling() . ")";
            ');
}

ここをマネしてフィボナッチ関数を作ってみた(しかも完全じゃない)
あと、呼び出し回数(sum)なんかも入れておく

実行してみる

$a = func();
var_dump($a(0));
var_dump($a(0));
var_dump($a(12));

$b = func();
var_dump($b(4));
var_dump($b(7));
string(9) "fib :0(1)"
string(9) "fib :0(2)"
string(13) "fib :144(467)"
string(9) "fib :3(9)"
string(11) "fib :13(50)"

phpでやるならclass使わないとダメかな。こりゃ。
よく分からなくなってきたので、後は任せます。
ref - steike.com » Php Closures