Necesito poder llamar a una función, pero el nombre de la función se almacena en una variable, ¿es esto posible? p.ej:
función foo () { // código aquí } barra de funciones () { // código aquí } $ functionName = "foo"; // necesito llamar a la función en función de lo que es $ functionName
php
dynamic-function
Lagartija
fuente
fuente
is_callable
función. Verificará si una variable contiene algo que se puede llamar como una función (ya sea el nombre de una función, una matriz que contiene una instancia de objeto y un nombre de función, o una función / cierre anónimo)call_user_func(array('ClassName', 'method'), $args)
Mi versión favorita es la versión en línea:
¡También puede colocar variables o expresiones dentro de los corchetes!
fuente
{"functionName"}();
no es legal y arrojará un error de sintaxis.Sí, es posible:
Fuente: http://www.onlamp.com/pub/a/php/2001/05/17/php_foundations.html?page=2
fuente
Como ya se mencionó, hay algunas maneras de lograr esto, posiblemente con el método más seguro
call_user_func()
o, si es necesario, también puede seguir la ruta$function_name()
. Es posible pasar argumentos utilizando ambos métodos como talSi la función que está llamando pertenece a un objeto, aún puede usar cualquiera de estos
Sin embargo, si va a utilizar el
$function_name()
método, puede ser una buena idea probar la existencia de la función si el nombre es dinámicofuente
En caso de que Google traiga a alguien más aquí porque estaban tratando de usar una variable para un método dentro de una clase, la siguiente es una muestra de código que realmente funcionará. Nada de lo anterior funcionó para mi situación. La diferencia clave es
&
en la declaración de$c = & new...
y&$c
se pasacall_user_func
.Mi caso específico es cuando se implementa el código de alguien que tiene que ver con colores y métodos de dos miembros
lighten()
ydarken()
de la clase csscolor.php. Por alguna razón, quería que el mismo código pudiera llamar a aclarar u oscurecer en lugar de seleccionarlo con lógica. Esto puede ser el resultado de mi terquedad de no solo usar if-else o cambiar el código que llama a este método.Tenga en cuenta que intentar cualquier cosa con
$c->{...}
no funcionó. Al leer detenidamente el contenido aportado por el lector en la parte inferior de la página de php.netcall_user_func
, pude reconstruir lo anterior. Además, tenga en cuenta que$params
como una matriz no funcionó para mí:Este intento anterior daría una advertencia sobre el método que espera un segundo argumento (porcentaje).
fuente
Algunos años tarde, pero esta es la mejor manera ahora en mi humilde opinión:
fuente
En aras de la integridad, también puede utilizar eval () :
Sin embargo,
call_user_func()
es la forma correcta.fuente
eval
No es una solución a esta pregunta.Solución: use PHP7
Nota: Para una versión resumida, vea TL; DR al final de la respuesta.
Viejos métodos
Actualización : se ha eliminado uno de los métodos antiguos explicados aquí. Consulte otras respuestas para obtener una explicación sobre otros métodos, no está cubierto aquí. Por cierto, si esta respuesta no te ayuda, deberías volver a actualizar tus cosas. La compatibilidad con PHP 5.6 finalizó en enero de 2019 (ahora incluso PHP 7.0 y 7.1 no son compatibles). Consulte las versiones compatibles para obtener más información.
Como otros mencionaron, en PHP5 (y también en versiones más nuevas como PHP7) podríamos usar variables como nombres de funciones, usar
call_user_func()
ycall_user_func_array()
(que, personalmente, odio esas funciones), etc.Nuevos métodos
A partir de PHP7, hay nuevas formas introducidas:
Nota: Todo entre
<something>
paréntesis significa una o más expresiones para formar algo, por ejemplo<function_name>
, expresiones que forman el nombre de una función.Llamada de función dinámica: nombre de la función sobre la marcha
Podemos usar una o más expresiones entre paréntesis como el nombre de la función de una sola vez, en forma de:
Por ejemplo:
Nota: Aunque eliminar los paréntesis
str_replace()
no es un error, poner paréntesis hace que el código sea más legible. Sin embargo, a veces no puede hacerlo, por ejemplo, mientras usa el.
operador. Para ser coherente, te recomiendo poner los paréntesis siempre.Llamada de método dinámico: nombre del método sobre la marcha
Al igual que las llamadas a funciones dinámicas, podemos hacer lo mismo con las llamadas a métodos, rodeadas de llaves en lugar de paréntesis (para formas adicionales, navegue a TL; sección DR):
Véalo en un ejemplo:
Llamada de método dinámico: la sintaxis de matriz
Una forma más elegante agregada en PHP7 es la siguiente:
Como ejemplo:
Nota: El beneficio de usar este método sobre el anterior es que no le importa el tipo de llamada (es decir, si es estático o no).
Ejemplo adicional: uso de clases anónimas
Para complicar un poco las cosas, puede usar una combinación de clases anónimas y las características anteriores:
TL; DR (Conclusión)
En general, en PHP7, es posible usar los siguientes formularios:
Basado principalmente en esta charla PHP .
fuente
(expressions)->$bar()
Nombres de funciones dinámicas y espacios de nombres
Solo para agregar un punto sobre los nombres de funciones dinámicas cuando se usan espacios de nombres.
Si está utilizando espacios de nombres, lo siguiente no funcionará, excepto si su función está en el espacio de nombres global:
¿Qué hacer?
Tienes que usar
call_user_func()
en su lugar:fuente
Complementando la respuesta de @Chris K si desea llamar al método de un objeto, puede llamarlo usando una sola variable con la ayuda de un cierre:
Publiqué otro ejemplo aquí
fuente
Lo que aprendí de esta pregunta y las respuestas. ¡Gracias a todos!
Digamos que tengo estas variables y funciones:
Para llamar a la función sin argumentos
Llamar a la función con 1 argumento
Para llamar a la función con 1 o más argumentos Esto será útil si está llamando dinámicamente a sus funciones y cada función tiene un número diferente de argumentos. Este es mi caso que he estado buscando (y resuelto).
call_user_func_array
es la llaveAdios adios
fuente
Use la función call_user_func.
fuente
El siguiente código puede ayudar a escribir funciones dinámicas en PHP. ahora el nombre de la función se puede cambiar dinámicamente por la variable '$ current_page'.
fuente
$function
variable sin ningún motivo.La forma más fácil de llamar a una función de forma segura utilizando el nombre almacenado en una variable es,
He usado lo siguiente para crear tablas de migración en Laravel dinámicamente,
fuente
Un enfoque poco convencional que se me ocurrió es que, a menos que esté generando todo el código a través de una IA súper ultra autónoma que se escribe , hay muchas posibilidades de que las funciones que desea llamar "dinámicamente" ya estén definidas en su código base. Entonces, ¿por qué no solo verificas la cuerda y haces el infame
ifelse
baile para convocar a ... entiendes mi punto?p.ej.
Incluso
switch-case
puede usarse si no le gusta el sabor suave de laifelse
escalera.Entiendo que hay casos en los que " llamar dinámicamente la función " sería una necesidad absoluta ( como una lógica recursiva que se modifica a sí misma ). Pero la mayoría de los casos de uso triviales cotidianos se pueden esquivar.
Elimina mucha incertidumbre de su aplicación, a la vez que le da la oportunidad de ejecutar una función alternativa si la cadena no coincide con ninguna de las definiciones de las funciones disponibles. EN MI HUMILDE OPINIÓN.
fuente
if (method_exists($functionName)) $functionName(); else //exception or handle
No sé por qué tienes que usar eso, no me suena tan bien, pero si solo hay una pequeña cantidad de funciones, podrías usar una construcción if / elseif. No sé si es posible una solución directa.
algo así como $ foo = "bar"; $ prueba = "foo"; prueba de eco $$;
debería volver a la barra, puedes probar pero no creo que esto funcione para las funciones
fuente