Me he estado preguntando si es posible o no pasar una función como parámetro en PHP; Quiero algo como cuando estás programando en JS:
object.exampleMethod(function(){
// some stuff to execute
});
Lo que quiero es ejecutar esa función en algún lugar de exampleMethod. ¿Es eso posible en PHP?
Respuestas:
Es posible si está utilizando PHP 5.3.0 o superior.
Consulte Funciones anónimas en el manual.
En su caso, definiría
exampleMethod
así:fuente
create_function
create_function()
. No es exactamente lo mismo, ya que tienes que pasar tu función como una cadena de código, que luego se poneeval()
detrás de escena. No es ideal, pero es posible que pueda usarlo.exampleMethod(strpos);
Solo para agregar a los demás, puede pasar un nombre de función:
Esto funcionará en PHP4.
fuente
También puede usar create_function para crear una función como una variable y pasarla. Sin embargo, me gusta más la sensación de funciones anónimas . Vuélvete zombat.
fuente
Solo codifícalo así:
Sería genial si pudieras inventar algo como esto (inspirado en Laravel Illuminate):
fuente
VERSIÓN PHP> = 5.3.0
Ejemplo 1: básico
Ejemplo 2: objeto std
Ejemplo 3: llamada de clase no estática
Ejemplo 4: llamada de clase estática
fuente
De acuerdo con la respuesta de @zombat, es mejor validar primero las funciones anónimas:
O valide el tipo de argumento desde PHP 5.4.0:
fuente
Probado para PHP 5.3
Como veo aquí, la función anónima podría ayudarlo: http://php.net/manual/en/functions.anonymous.php
Lo que probablemente necesitará y no se dijo antes es cómo pasar una función sin envolverla dentro de una función creada sobre la marcha . Como verá más adelante, deberá pasar el nombre de la función escrito en una cadena como parámetro, verificar su "capacidad de llamada" y luego llamarlo.
La función para verificar:
Luego, para llamarlo, use este fragmento de código (si también necesita parámetros, colóquelos en una matriz), que se ve en: http://php.net/manual/en/function.call-user-func.php
como sigue (de una manera similar, sin parámetros):
Aquí hay una clase que explica cómo hacer algo similar:
y un ejemplo de uso
fuente
Ejemplo simple usando una clase:
fuente