Estoy seguro de que hay una explicación muy sencilla para esto. ¿Cuál es la diferencia entre esto?
function barber($type){
echo "You wanted a $type haircut, no problem\n";
}
call_user_func('barber', "mushroom");
call_user_func('barber', "shave");
... y esto (¿y cuáles son los beneficios?):
function barber($type){
echo "You wanted a $type haircut, no problem\n";
}
barber('mushroom');
barber('shave');
call_user_func
no es necesariamente necesario. Siempre se puede llamar a una función mediante el uso de funciones variables:$some_func()
.call_user_func_array
es el que es realmente útil.$func = function(){};
. Cualquier posible parámetro para call_user_func tiene que ser exigible, lo que significa que contiene datos suficientes para acceder a ella directamente, ya sea$func()
, o$obj->{$func}()
, o lo que sea.Aunque puede llamar a los nombres de funciones variables de esta manera:
hay casos en los que no sabe cuántos argumentos está pasando. Considera lo siguiente:
También es útil para llamar a métodos estáticos y de objetos, respectivamente:
fuente
la
call_user_func
opción está ahí para que pueda hacer cosas como:donde la
dynamicFunctionName
cadena podría ser más emocionante y generada en tiempo de ejecución. No debe usar call_user_func a menos que sea necesario, porque es más lento.fuente
Imagino que es útil para llamar a una función de la que no conoces el nombre de antemano ... Algo como:
fuente
$func('stuff');
call_user_func()
en este escenario.Con PHP 7 puede usar la sintaxis de función variable más agradable en todas partes. Funciona con funciones estáticas / de instancia y puede tomar una serie de parámetros. Más información en https://trowski.com/2015/06/20/php-callable-paradox
fuente
No hay beneficios para llamar a la función de esa manera porque creo que se usa principalmente para llamar a la función "usuario" (como un complemento) porque editar el archivo central no es una buena opción. aquí hay un ejemplo sucio utilizado por Wordpress
...
....
salida
fuente
en su primer ejemplo, está usando un nombre de función que es una cadena. puede provenir del exterior o determinarse sobre la marcha. es decir, no sabe qué función deberá ejecutarse en el momento de la creación del código.
fuente
Cuando se utilizan espacios de nombres, call_user_func () es la única forma de ejecutar una función que no conoce el nombre de antemano, por ejemplo:
Si todas sus funciones estuvieran en el mismo espacio de nombres, entonces no sería un problema, ya que podría usar algo como esto:
Editar: Siguiendo a @Jannis diciendo que estoy equivocado, hice un poco más de pruebas y no tuve mucha suerte:
Puede ver los resultados de salida aquí: https://3v4l.org/iBERh parece que el segundo método funciona para PHP 7 en adelante, pero no PHP 5.6.
fuente