如何将变量绑定到Closure?

时间:2015-09-11 19:05:21

标签: php

我正在寻找如何实现一个函数,它将任何变量绑定到函数。

使用假设函数\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?

1 个答案:

答案 0 :(得分:4)

也许我不明白,但我试着回答。

正如我从文档中看到的那样,bind方法就在这里,为闭包设置一个对象上下文。

所以如果你有对象foo:

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

您可以通过关闭中的foo访问$this

也许你想要这样的东西:

$foo = new stdClass();
$foo->bar = "42";

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

$closure.bindTo($foo);
echo $closure();

也许你想要这个:

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();