2015-08-06 12 views
7

Esiste un modo per passare qualsiasi variabile attualmente in ambito facendo riferimento a una funzione lambda senza elencarli tutti nell'istruzione use(...)?PHP equivalente a [&, epsilon] C++ "Catturare" le variabili in lambda?

Qualcosa di simile

$foo = 12; 
$bar = 'hello'; 

$run = function() use (&) { 
    $foo = 13; 
    $bar = 'bye'; 
} 

// execute $run function 

conseguente $foo pari a 13 e $bar pari a 'bye'.

+2

In breve: no, non esiste una stenografia. – deceze

+1

Una funzione denominata non consente la parola chiave 'use'. – Sylwester

+0

@Sylwester scusa per questo, ho modificato la mia domanda. –

risposta

1

TL; DR La risposta breve è no. Hai bisogno di nominare le variabili

Non hai bisogno di variabili di chiusura per questo. Non è nemmeno valido utilizzare use con funzioni con nome dato che non avrà un ambito lessicale nidificato. Utilizzare la parola chiave global per rendere le variabili "dinamiche". Devi nominare tutte le variabili che sono speciali.

$foo = 12; 
$bar = 'hello'; 

function run() { 
    global $foo,$bar; 
    $foo = 13; 
    $bar = 'bye'; 
} 

run(); 
print "$foo, $bar\n"; // prints "13, bye" 

Per un lessicali funzioni anonime necessarie per nominare tutte le variabili con la parola use e utilizzare & per farlo riferimento:

$foo = 12; 
$bar = 'hello'; 

$run = function() use (&$foo,&$bar) { 
    $foo = 13; 
    $bar = 'bye'; 
}; 
call_user_func($run); 
print "$foo, $bar\n"; // prints "13, bye" 
+0

L'ambito "corrente" e l'ambito * globale * non sono necessariamente gli stessi. Speriamo che * di solito non lo siano. * – deceze

+0

@deceze Questo non è vero. Vedete chiaramente nell'esempio che la funzione named non ha altro lessicale '$ pippo' o' $ bar'. Se fosse stata una funzione anonima, la questione sarebbe stata diversa. – Sylwester

+0

1) L'esempio è chiaramente un codice pseudo, in quanto non valido. 2) L'OP parla esplicitamente delle funzioni * lambda * (anonime) e * "attuali" *. La tua risposta è utile solo per un piccolo sottoinsieme di casi d'uso, che dovresti almeno chiarire. – deceze

0

Si potrebbe usare get_defined_vars() insieme extract():

$foo = 12; 
$bar = 'hello'; 

$vars = get_defined_vars(); 

foreach (array_keys($vars) as $var) { 
    $vars[$var] = &$$var; // keep refs of all variables from current scope 
} 

$run = function() use($vars) { 
    extract($vars, EXTR_REFS); 
    $foo = 13; 
    $bar = 'bye'; 
}; 

// execute $run function 
$run(); 
print $foo; // prints 13 
print $bar; // prints bye