2012-06-03 17 views
23

Por ejemplo, si hago esto:¿La palabra clave use en cierres de PHP pasa por referencia?

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

$my_var = 0; 
bar($my_var); 

Will $my_var ser modificado? Si no, ¿cómo hago para que funcione sin agregar un parámetro al $foo?

+0

no, no será modificado .. Esto se explica en el manual –

Respuesta

39

No, no se pasan por referencia - el use sigue una notación similar como parámetros de la función. Puede validar que por su cuenta con la ayuda de la función 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; 

Salida:

long(0) refcount(3) 
0 

A-mediante el pleno-all-ámbitos de trabajo de referencia tendría un refcount de 1. como está escrito a lograr que al definir el uso como el paso por referencia:

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

también es posible crear la repetición de esta manera:

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

me di cuenta que se olvidó de marcar esto como mejor respuesta .. – elite5472

+0

gracias por el heads-up! – hakre

+1

¡Mejor un año después que nunca! – elite5472

13

Los cierres son, por definición, cerrados por valor, no por referencia. Es posible que "usar como referencia" mediante la adición de un & en la lista de argumentos:

function() use (&$var) 

Esto se puede ver en el ejemplo 3 en el anonymous functions manual page.

1

No, no se pasan por referencia.

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 
Cuestiones relacionadas