2011-09-19 21 views
6

cuando trato de hacer esto:¿Cómo se definen las funciones locales en PHP?

function a() 
{ 
    function b() { } 
} 

a(); 
a(); 

me sale Cannot redeclare b....
cuando traté de hacer esto:

function a() 
{ 
    if(!isset(b)) 
     function b() { } 
} 

a(); 
a(); 

me sale unexpected), expected ....
¿Cómo puedo declarar la función como local y ser olvidado cuando devuelve a? Necesito la función para pasarlo a array_filter.

+3

funciones de anidación está pidiendo un mundo de dolor. –

+1

¿Qué versión de PHP estás usando? –

+0

@Mark Elliot: La versión que produjo esos errores es 'PHP Version 5.3.2-1ubuntu4.2', pero esto tiene que ejecutarse en' PHP Version 5.3.6' – Dani

Respuesta

7

Se podría utilizar un anonymous function en su llamada array_filter.

+0

+1 Suelo usar 'array_filter ($ array, function ($ x) {...});' –

3

Puede probar la función create_function que PHP tiene. http://php.net/create_function

$myfunc = create_function(..., ...); 
array_filter(..., $myfunc(...)); 
unset($myfunc); 

Este método no requiere PHP 5.3+

5

La idea de la "función local" también se denomina "función dentro de la función" o "nested function" ... La pista fue en esta página, anonymous function, citado por @ceejayoz y @Nexerus, pero, vamos a explicar!

  1. En PHP sólo existen alcance global para la declaración de funciones;
  2. La única alternativa es para usar otro tipo de función, la anónima.

que explican por los ejemplos:

  1. la función b() en function a(){ function b() {} return b(); } también es global, por lo que la declaración tiene el mismo efecto que function a(){ return b(); } function b() {}.

  2. Para declarar algo así como "una función b() en el ámbito de un()" la única alternativa es usar no b() sino una referencia $b(). La sintaxis será algo así como function a(){ $b = function() { }; return $b(); }

PD: no es posible en PHP para declarar una "referencia estática", la función anónima será nunca se estática.

Consulte también:

0

Usted puede definir la función local dentro de PHP, pero se puede declarar sólo una vez. Esto se puede lograr definiendo y comparando variables estáticas.

Comprobar el siguiente ejemplo:

<?php 
function a() 
{ 
    static $init = true; 
    if ($init) { 
    function b() { } 
    $init = FALSE; 
    } 
} 

a(); 
a(); 

Alternativamente comprobando si la función ya existe:

<?php 
function a() 
{ 
    if (!function_exists('b')) { 
    function b() { } 
    } 
} 

a(); 
a(); 
Cuestiones relacionadas