La parola chiave use in chiusure di PHP passa per riferimento?

Ad esempio, se faccio questo:

function bar(&$var) { $foo = function() use ($var) { $var++; }; $foo(); } $my_var = 0; bar($my_var); 

$my_var sarà modificato? Altrimenti, come posso farlo funzionare senza aggiungere un parametro a $foo ?

No, non vengono passati per riferimento – l' use segue una notazione simile come i parametri della function. Puoi validationrlo da solo con l'aiuto della function debug_zval_dump ( Demo ):

 <?php header('Content-Type: text/plain;'); function bar(&$var) { $foo = function() use ($var) { debug_zval_dump($var); $var++; }; $foo(); }; $my_var = 0; bar($my_var); echo $my_var; 

Produzione:

 long(0) refcount(3) 0 

Un riferimento operativo completo di tutti gli ambiti avrebbe un count di 1. Come scritto, lo si ottiene definendo l'utilizzo come pass-per-riferimento:

  $foo = function() use (&$var) 

È anche ansible creare la ricorsione in questo modo:

 $func = NULL; $func = function () use (&$func) { $func(); } 

Le chiusure sono, quasi per definizione, chiuse per valore, non per riferimento. Puoi "usare come riferimento" aggiungendo un & nella list degli argomenti:

 function() use (&$var) 

Questo può essere visto nell'esempio 3 nella pagina di manuale delle funzioni anonime .

No, non sono passati per riferimento.

 function foo(&$var) { $foo = function() use ($var) { $var++; }; $foo(); } $my_var = 0; foo($my_var); echo $my_var; // displays 0 function bar(&$var) { $foo = function() use (&$var) { $var++; }; $foo(); } $my_var = 0; bar($my_var); echo $my_var; // displays 1