2013-05-03 14 views
6

Sto usando PHP 5.4 e mi chiedo se le funzioni anonime che sto facendo abbiano uno scope lessicale?PHP ha scope lessicale in funzioni/chiusure anonime?

I.e. Se ho un metodo di controllo:

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

quando la fabbrica di accesso chiama la funzione è stato passato, sarà il $ this si riferisce al controller in cui è stato definito?

risposta

6

Le funzioni anonime non utilizzano lo scope lessicale, ma $this is a special case and will automatically be available inside the function as of 5.4.0. Il tuo codice dovrebbe funzionare come previsto, ma non sarà portabile a versioni precedenti di PHP.


Di seguito vi non lavoro:

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

Invece, se si vuole iniettare le variabili in campo di applicazione della chiusura, è possibile utilizzare la parola chiave use. Il seguente sarà lavoro:

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

In 5.3.x, è possibile ottenere l'accesso al $this con la seguente soluzione:

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

Vedere this question and its answers per maggiori dettagli.

+0

Ah, buono a sapersi è diverso in PHP5.4 (che ancora non ha ancora raggiunto i miei pacchetti di Debian Stable ... potrebbe essere necessario installarlo manualmente). – Wrikken

+0

Ho bisogno di un "use ($ this)" o 5.4 ti dà automaticamente accesso a $ this? – Charles

+0

5.4.0+ associa automaticamente '$ this'. Guarda [questo breve video] (http://youtu.be/-Ph7X6Y6n6g) spiegandolo. –

1

In breve, no, ma è possibile accedere pubblici metodi & funzioni passandolo:

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

edit: come Matt ha giustamente sottolineato support for $this in closures started with PHP 5.4