2010-03-09 14 views
19

¿Es posible acceder al varialbe local externo en una subfunción de PHP?¿Es posible acceder a la variable local externa en PHP?

En el siguiente código, quiero acceder a la variable $l en la barra de funciones interna. Declarar $l como global $l en la barra no funciona.

function foo() 
{ 
    $l = "xyz"; 

    function bar() 
    { 
     echo $l; 
    } 
    bar(); 
} 
foo(); 

Respuesta

33

No creo que esto es posible con PHP 5.2 ...

Con PHP 5.3, sin embargo, que probablemente podría utilizar un cierre, para hacer precisamente eso ...


Editar: tomó un tiempo para recordar la sintaxis, pero esto es lo que se vería así:

function foo() 
{ 
    $l = "xyz"; 
    $bar = function() use ($l) 
    { 
     var_dump($l); 
    }; 
    $bar(); 
} 
foo(); 

Y, ejecutar el script, se obtendría:

$ php temp.php 
string(3) "xyz" 


Un par de nota:

  • Debe poner un ; después de la declaración de la función!
  • Se podría use la variable por referencia, con un & antes de que sea nombre: use (& $l)

Para más informaciones, como referencia, se puede echar un vistazo a esta página en el manual: Anonymous functions

+0

¿Por qué usa funciones anidadas en absoluto? –

+0

Quién sabe ^^ Esa no era la pregunta ^^ ;; con PHP 5.3 y funciones anónimas, puede ser bastante útil para Closures ;;; Antes de PHP 5.3 ... nunca he usado ninguna función anidada con PHP <5.3. –

+2

@PascalMARTIN Es importante destacar que las funciones anidadas antes de PHP 5.3 _no existe_. A pesar de parecer que están declarados localmente, terminan en el ámbito global. Creo que lo mismo es cierto ahora, por lo que debes usar funciones anónimas para lograr cualquier tipo de anidación. – Izkata

4

En PHP 5.3 debe usar la palabra clave use.

$bar = function() use(&$l) { 
}; 
$bar(); 

En PHP 5.2 y versiones anteriores, esto no funcionará. La sintaxis que tienes no es un cierre, sino la definición de una función global.

function foo() { function bar() { } } 

funciona de la misma como:

function foo() { include "file_with_function_bar.php"; } 

Si ejecuta la función foo dos veces, PHP se quejará de que usted ha tratado de redefinir la función (global) bar.

+0

¡Demasiados pronombres! ¿Qué morirá en la segunda ejecución? ¿La variable externa, o la variable tal como es "usada" en la función interna? Y qué significa morir (no ser sarcástico, solo querer saber). ¿Morir significa que la variable no se puede usar o que tiene que restablecerse por algún otro medio? Supongo que fallece (en cualquier sentido) porque la ubicación compartida a la que ambos apuntan no puede ser reenfocada después de la primera ejecución. ¿Qué pasa si la variable se convierte en estática y luego se desarma inmediatamente después? – Anthony

+0

morir significa 'morir (" Error fatal ")'.No hay cierres ni funciones internas en PHP <= 5.2. La función dentro de la función no está permitida, y el hecho de que no sea un error de sintaxis es accidental (debería ser un error de sintonía). PHP 5.3 es completamente diferente. Permite funciones dentro de funciones, pero con una sintaxis ligeramente diferente. Una vez que obtenga la sintaxis correcta, en PHP 5.3+, funcionará como espera en otros idiomas. – Kornel

Cuestiones relacionadas