2009-09-30 12 views
54

ej .:¿Se puede almacenar una función en una matriz de PHP?

$functions = array(
    'function1' => function($echo) { echo $echo; } 
); 

Es esto posible? ¿Cuál es la mejor alternativa?

+18

vienes Javascript? –

+1

** TL; DR - desde PHP 5.4: ** '$ functions = ['function1' => function ($ echo) {echo $ echo; }]; ' ...... ya que PHP 5.3 funciones anónimas están disponibles, desde 5.4 puede escribir' [] 'en lugar de' matriz() ' –

Respuesta

125

Hay algunas opciones. Utilice create_function:

$functions = array(
    'function1' => create_function('$echo', 'echo $echo;') 
); 

almacenar simplemente el nombre de la función como una cadena (esto es, efectivamente, todo create_function está haciendo):

function do_echo($echo) { 
    echo $echo; 
} 

$functions = array(
    'function1' => 'do_echo' 
); 

Si está usando PHP 5.3 se puede hacer uso de anonymous functions:

$functions = array(
    'function1' => function($echo) { 
     echo $echo; 
    } 
); 

Todos estos métodos se enumeran en la documentación bajo callback pseudo-type. Cualquiera que elija, la forma recomendada de llamar a su función sería con la función call_user_func o call_user_func_array.

call_user_func($functions['function1'], 'Hello world!'); 
+2

Agradable. +1 para completar, y para darle el décimo voto. – karim79

+3

He alcanzado la iluminación. Muchas gracias karim79 :) –

+0

sobre call_user_func: Is $ var = $ functions ["function1"], cuando function1 devuelve un valor, ¿mala práctica? – Roy

9

Para dar seguimiento a cargo de Alex Barrett, create_function() devuelve un valor que en realidad se puede utilizar para llamar a la función, así:

$function = create_function('$echo', 'echo $echo;'); 
$function('hello world'); 
8

A partir de PHP "5.3.0 Las funciones anónimas que se disponga ", ejemplo de uso:

nota que esto es mucho más rápido que usar edad create_function ...

//store anonymous function in an array variable e.g. $a["my_func"] 
$a = array(
    "my_func" => function($param = "no parameter"){ 
     echo "In my function. Parameter: ".$param; 
    } 
); 

//check if there is some function or method 
if(is_callable($a["my_func"])) $a["my_func"](); 
    else echo "is not callable"; 
// OUTPUTS: "In my function. Parameter: no parameter" 

echo "\n<br>"; //new line 

if(is_callable($a["my_func"])) $a["my_func"]("Hi friend!"); 
    else echo "is not callable"; 
// OUTPUTS: "In my function. Parameter: Hi friend!" 

echo "\n<br>"; //new line 

if(is_callable($a["somethingElse"])) $a["somethingElse"]("Something else!"); 
    else echo "is not callable"; 
// OUTPUTS: "is not callable",(there is no function/method stored in $a["somethingElse"]) 

REFERENCIAS:

Cuestiones relacionadas