2013-09-04 5 views
14

Sono un po 'confuso con chiusure PHP. Qualcuno può chiarire questo per me:Confusione con identificatore 'uso' nelle chiusure PHP

// Sample PHP closure 
my_method(function($apples) use ($oranges) { 
    // Do something here 
}); 

Qual è la differenza tra $apples e $oranges e quando dovrei usare ciascuno?

+0

Possibile duplicato (http://stackoverflow.com/questions/1065188/in- php-5-3-0-quale-è-l'-uso-identificativo) – Trix

risposta

16

$apples assumerà il valore che viene passato alla funzione quando viene chiamato, ad es.

function my_method($callback) { 
    // inside the callback, $apples will have the value "foo" 
    $callback('foo'); 
} 

$oranges farà riferimento al valore della variabile $oranges esistente nell'area in cui è definita la chiusura. Es .:

$oranges = 'bar'; 

my_method(function($apples) use ($oranges) { 
    // $oranges will be "bar" 
    // $apples will be "foo" (assuming the previous example) 
}); 

Le differenze è che $oranges è vincolata quando la funzione è definita e $apples è vincolata quando la funzione è chiamato .


Le chiusure consentono di accedere a variabili definite al di fuori della funzione, ma è necessario indicare esplicitamente a PHP quali variabili devono essere accessibili. Questo è simile (ma non equivalente!) Ad usare la parola chiave global se la variabile è definita in ambito globale:

$oranges = 'bar'; 

my_method(function($apples) { 
    global $oranges; 
    // $oranges will be "bar" 
    // $apples will be "foo" (assuming the previous example) 
}); 

Le differenze tra l'utilizzo di chiusure e global:

  • è possibile associare locale variabili alle chiusure, global funziona solo con variabili globali.
  • Chiusure legano il valore della variabileal momento della chiusura era definito. Le modifiche alle variabili dopo che la funzione è stata definita non hanno effetto.
    D'altra parte, se si utilizza global, si riceverà il valore della variabile nel momento in cui la funzione è denominata.

    Esempio: [? In PHP 5.3.0, qual è la funzione di "usare" identificatore]

    $foo = 'bar'; 
    $closure = function() use ($foo) { 
        echo $foo; 
    }; 
    $global = function() { 
        global $foo; 
        echo $foo; 
    }; 
    
    $foo = 42; 
    $closure(); // echos "bar" 
    $global(); // echos 42 
    
+0

Come è diverso dall'uso di 'globale' perché è la prima cosa che viene in mente. – enchance

+0

@enchance: Perché 'use' può accedere a variabili in ambito locale. Quando si usa '($ arance)', '$ aranci 'non ha bisogno di essere globale come fa quando si esegue' arance globali $; '. –

+1

'global' ** non è ** equivalente a' use' dato che 'global' si riferirà al puro contesto globale (rappresentato anche da' $ GLOBALS') mentre 'use' passerà solo il contesto locale corrente. –

3

$apples viene passato come argomento per my_method, e $oranges viene iniettata all'interno.