2013-05-03 9 views
6

私はPHP 5.4を使用しています。私が作っている匿名関数にレキシカルスコープがあるのだろうか?PHPは匿名関数/クロージャで字句範囲を持っていますか?

I.e.私は、コントローラのメソッドがある場合:

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

にアクセスする工場は、それが渡された関数を呼び出すと、$これは、それが定義されたコントローラを参照してくださいだろうか?

答えて

6

匿名関数では語彙スコープは使用されませんが、$this is a special case and will automatically be available inside the function as of 5.4.0です。あなたのコードは期待どおりに機能するはずですが、古いPHPバージョンに移植することはできません。


以下はないは動作します:あなたはクロージャのスコープに変数を挿入したい場合は

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

代わりに、あなたはuseキーワードを使用することができます。次作業します:5.3.xでは

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

、あなたは次の回避策で$thisへのアクセスを得ることができます。

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

は詳細についてthis question and its answersを参照してください。要するに

+0

ああを、指摘したように:編集

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

をPHP5.4で(私のDebian Stableパッケージにはまだ達していませんが...手動でインストールする必要があります)。 – Wrikken

+0

"use($ this)"が必要ですか、または5.4が自動的に$ thisにアクセスできますか? – Charles

+0

5.4.0+は '$ this'を自動的にバインドします。それを説明する[この短いビデオ](http://youtu.be/-Ph7X6Y6n6g)をチェックしてください。 –

関連する問題