7

我正在使用 PHP 5.4 并且想知道我正在制作的匿名函数是否具有词法范围?

即如果我有一个控制器方法:

protected function _pre() {
    $this->require = new Access_Factory(function($url) {
        $this->redirect($url);
    });
}

当访问工厂调用它传递的函数时,$this 是否会引用定义它的控制器?

4

2 回答 2

7

匿名函数不使用词法作用域,但$this它是一种特殊情况,自 5.4.0 起将自动在函数内部可用。您的代码应该可以按预期工作,但它不能移植到较旧的 PHP 版本。


以下将不起作用

protected function _pre() {
    $methodScopeVariable = 'whatever';
    $this->require = new Access_Factory(function($url) {
        echo $methodScopeVariable;
    });
}

相反,如果你想将变量注入闭包的作用域,你可以使用use关键字。以下起作用:

protected function _pre() {
    $methodScopeVariable = 'whatever';
    $this->require = new Access_Factory(function($url) use ($methodScopeVariable) {
        echo $methodScopeVariable;
    });
}

在 5.3.x 中,您可以通过$this以下解决方法访问:

protected function _pre() {
    $controller = $this;
    $this->require = new Access_Factory(function($url) use ($controller) {
        $controller->redirect($url);
    });
}

有关更多详细信息,请参阅此问题及其答案

于 2013-05-03T17:30:12.603 回答
1

简而言之,不,但您可以通过传递它来访问公共方法和函数:

$that = $this;
$this->require = new Access_Factory(function($url) use ($that) {
    $that->redirect($url);
});

编辑:正如马特正确指出的那样,对$thisin 闭包的支持始于 PHP 5.4

于 2013-05-03T17:31:41.037 回答