2010-11-16 18 views
10

¿Es posible pasar una función anónima como argumento y hacer que se ejecute inmediatamente, pasando el valor de la función return?PHP: Pase la función anónima como argumento

function myFunction(Array $data){ 
    print_r($data); 
} 

myFunction(function(){ 
    $data = array(
     'fruit'  => 'apple', 
     'vegetable' => 'broccoli', 
     'other'  => 'canned soup'); 
    return $data; 
}); 

Esto arroja un error debido a la Array tipo-pista, quejándose de un objeto que se pasa. De acuerdo, si elimino la sugerencia de tipo, por supuesto escupe Closure Object, en lugar de los resultados que quiero. Entiendo que técnicamente estoy pasando una instancia de objeto de Closure a myFunction, sin embargo, estoy seguro de que he visto esto logrado en otro lugar. es posible? Si es así, ¿qué estoy haciendo mal?

Por el bien de esta discusión, no puedo modificar la función a la que estoy pasando el cierre.

tl; dr: ¿Cómo puedo pasar una declaración de función anónima como argumento, dando como resultado el valor de retorno pasado como argumento?

PD: Si no está claro, la salida deseada es:

Array 
(
    [fruit] => apple 
    [vegetable] => broccoli 
    [other] => canned soup 
) 
+0

usted probablemente ha visto esto en Javascript como '(function() {})()', pero las funciones de PHP no son tan flexibles. – deceze

Respuesta

9

No se puede. Tendría que llamarlo primero. Y a partir de PHP no soporta el cierre aún de referencias, que tendría que almacenar en una variable en primer lugar:

$f = function(){ 
    $data = array(
     'fruit'  => 'apple', 
     'vegetable' => 'broccoli', 
     'other'  => 'canned soup'); 
    return $data; 
}; 
myfunction($f()); 
+0

Gracias * ircmaxell *; Maldición, supongo que los cierres pasaron como se llamaron los argumentos que he visto en algún momento en el cuerpo de la función a la que se les pasó. Demasiado. – Dan

+7

Pocos años después ... [es posible] (http://php.net/manual/en/functions.anonymous.php) – Alex

4

estás pasando a la función en sí, no a los resultados a medida que se dio cuenta. Habría que ejecutar esa función inmediatamente hacer algo como esto:

myFunction((function() { 
    return ...; 
})(), $otherArgs); 

PHP no soporta este tipo de cosas, por lo que está obligado a asignar esa función a alguna variable y ejecutarlo:

$func = function() { ... }; 
myFunction($func(), $otherArgs); 
+13

¿De verdad? ¿Tenemos que seguir por el camino de hablar mal de PHP (diciendo que apesta, sin señalar una deficiencia) con tanta frecuencia? Tanto odio ... Si crees que apesta, está bien. Superarlo ... – ircmaxell

+0

Gracias * Crozin *; Tendré que considerar otras opciones. – Dan

7

Recientemente, estaba la solución de problemas similares, así que estoy publicando mi código que está funcionando como se esperaba:

$test_funkce = function ($value) 
{ 

    return ($value + 10); 
}; 


function Volej($funkce, $hodnota) 
{ 

    return $funkce->__invoke($hodnota); 
    //or alternative syntax 
    return call_user_func($funkce, $hodnota); 

} 

echo Volej($test_funkce,10); //prints 20 

espero que ayude. Primero, estoy creando cierre, luego función que acepta cierre y argumento y está invocando su interior y devolviendo su valor. Simplemente suficiente.

PS: respondidas gracias a esta respuesta: answers

+0

Lástima que esta respuesta es tan nueva en comparación con las otras, pero esto es definitivamente lo que me ayudó en mi caso, ¡gracias por esto! –

+0

Hay pocos recursos buenos para php funcional pero en realidad php se comporta realmente extraño cuando estoy intentando algo con cierres. –

Cuestiones relacionadas