我正在使用 PHP 5.4 并且想知道我正在制作的匿名函数是否具有词法范围?
即如果我有一个控制器方法:
protected function _pre() {
$this->require = new Access_Factory(function($url) {
$this->redirect($url);
});
}
当访问工厂调用它传递的函数时,$this 是否会引用定义它的控制器?
匿名函数不使用词法作用域,但$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);
});
}
有关更多详细信息,请参阅此问题及其答案。
简而言之,不,但您可以通过传递它来访问公共方法和函数:
$that = $this;
$this->require = new Access_Factory(function($url) use ($that) {
$that->redirect($url);
});
编辑:正如马特正确指出的那样,对$this
in 闭包的支持始于 PHP 5.4