2015-09-11 2 views
7

私は関数を実装する方法を探しています。これは、任意の変数を関数にバインドします。変数をClosureにバインドする方法は?

架空の機能\Closure::bindVariable($closure, $name, $value)を使用して、実装は、このようなことができます:

function bindAnything($closure, $anyVariables) 
{ 
    foreach ($variables as $variable => $value) { 
     \Closure::bindVariable($closure, $variable, $value); 
    } 
    return $variable; 
} 

は生憎、何\Closure::bindVaraiableはありません。 \Closure::bindがありますが、この機能では$thisのみがバインドされています。

http://php.net/manual/en/class.closure.php


UPDATE:簡単にこれを行うにはどのように方法がないようです。いくつかの生成コード& eval magicはどうですか?

+0

私はこれが可能であるとは思わないが、私はまた、任意の有効利用を考えることができない。

$foo = new stdClass(); $foo->bar = "42"; $closure = function() { return $this->bar; }; $closure.bindTo($foo); echo $closure(); 

はたぶん、あなたはこれが欲しい:

はたぶん、あなたはそのような何かをしたいですそのような特徴のために。 – melpomene

+0

http://php.net/manual/ja/closure.bindto.php? –

+1

そしてあなたはそれをどうしますか? –

答えて

4

多分わかりませんが、私は答えようとします。

ドキュメントからわかるように、バインドメソッドはクロージャのオブジェクトコンテキストを設定するためのものです。

ですから、オブジェクトfooを持っている場合:

class foo {}; 
$foo = new foo(); 

あなたが閉鎖に$thisによってfooにアクセスすることができます。

function bindAnything($closure, $anyVariables) 
{ 
    $obj = (object)$anyVariables; 
    $closure.bindTo($obj); 
    return $closure; 
} 

$closure = function() { 
    return $this->foo; 
}; 

var $arr = ["foo" => "bar"]; 

$newClosure = bindAnything($closure, $arr); 
echo $newClosure(); 
+0

ご回答ありがとうございますが、$ thisだけでなく、変数をバインドする方法を探しました。例えば。 function(myfunc)use($ a、$ b){...} - $ aと$ bはphpの構文機能によってバインドされていますが、これをプログラマチックに行う方法を探しています – jasir

+0

何をしようとしていますか? Aは閉鎖はあなたのために働かないでしょうか? –

+0

オリジナルの動機づけはおそらく過剰に設計された解決策でしたが、今ではこの質問はPHPで可能なことが好奇心の詳細です。 – jasir

関連する問題