Using PHP 8, call_user_func_array call callback function using named arguments if an array with keys is passed to $args parameter, if the array used has only values, arguments are passed positionally.
<?php
function test(string $param1, string $param2): void
{
echo $param1.' '.$param2;
}
$args = ['hello', 'world'];
//hello world
call_user_func_array('test', $args);
$args = ['param2' => 'world', 'param1' => 'hello'];
//hello world
call_user_func_array('test', $args);
$args = ['unknown_param' => 'hello', 'param2' => 'world'];
//Fatal error: Uncaught Error: Unknown named parameter $unknown_param
call_user_func_array('test', $args);
?>| CARVIEW |
call_user_func_array
(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)
call_user_func_array — Llama a una función de retorno con los argumentos agrupados en un array
Descripción
Llama a la función de retorno callback
proporcionada con los argumentos args,
agrupados en un array.
Parámetros
callback-
La función de retorno a llamar.
args-
Los argumentos a pasar a la función de retorno, en forma de array.
Si las claves de
argsson todas numéricas, las claves son ignoradas y cada elemento será transmitido acallbackcomo argumento posicional, en el orden.Si algunas claves de
argsson strings, estos elementos serán transmitidos acallbackcomo argumentos nombrados, con el nombre dado por la clave.No es permitido tener una clave numérica en
argsque aparezca después de una clave de string, o tener una clave de string que no corresponda al nombre de algún parámetro decallback
Valores devueltos
Retorna el valor retornado por la función
de retorno, o false si ocurre un error.
Historial de cambios
| Versión | Descripción |
|---|---|
| 8.0.0 |
Las claves args serán interpretadas como nombres de parámetros,
en lugar de ser ignoradas silenciosamente.
|
Ejemplos
Ejemplo #1 Ejemplo con call_user_func_array()
<?php
function foobar($arg, $arg2) {
echo __FUNCTION__, " recibió $arg y $arg2\n";
}
class foo {
function bar($arg, $arg2) {
echo __METHOD__, " recibió $arg y $arg2\n";
}
}
// Llamar a la función foobar() con 2 argumentos
call_user_func_array("foobar", array("one", "two"));
// Llamar al método $foo->bar() con 2 argumentos
$foo = new foo;
call_user_func_array(array($foo, "bar"), array("three", "four"));
?>Resultado del ejemplo anterior es similar a:
foobar recibió one y two foo::bar recibió three y four
Ejemplo #2 Ejemplo con call_user_func_array() utilizando un espacio de nombres
<?php
namespace Foobar;
class Foo {
static public function test($name) {
print "¡Hola {$name}!\n";
}
}
call_user_func_array(__NAMESPACE__ .'\Foo::test', array('Hannes'));
call_user_func_array(array(__NAMESPACE__ .'\Foo', 'test'), array('Philip'));
?>El ejemplo anterior mostrará:
¡Hola Hannes! ¡Hola Philip!
Ejemplo #3 Uso de una función lambda
<?php
$func = function($arg1, $arg2) {
return $arg1 * $arg2;
};
var_dump(call_user_func_array($func, array(2, 4)));
?>El ejemplo anterior mostrará:
int(8)
Ejemplo #4 Pasando un valor por referencia
<?php
function mega(&$a){
$a = 55;
echo "function mega \$a=$a\n";
}
$bar = 77;
call_user_func_array('mega',array(&$bar));
echo "global \$bar=$bar\n";
?>El ejemplo anterior mostrará:
function mega $a=55 global $bar=55
Ejemplo #5 call_user_func_array() utilizando argumentos nombrados
<?php
function foobar($first, $second) {
echo __FUNCTION__, " recibió $first y $second\n";
}
// Llamar a la función foobar() con argumentos nombrados en orden no posicional
call_user_func_array("foobar", array("second" => "two", "first" => "one"));
// Llamar a la función foobar() con un argumento nombrado
call_user_func_array("foobar", array("foo", "second" => "bar"));
// Error fatal: No se puede usar un argumento posicional después de un argumento nombrado
call_user_func_array("foobar", array("first" => "one", "bar"));
?>Resultado del ejemplo anterior es similar a:
foobar recibió one y two foobar recibió foo y bar Fatal error: Uncaught Error: Cannot use positional argument after named argument
Notas
Nota:
Las devoluciónes de llamada registradas con funciones como call_user_func() y call_user_func_array() no serán llamadas si una excepción no es interceptada cuando ha sido lanzada en una función de devolución de llamada anterior.
Ver también
- call_user_func() - Llama a una función de retorno proporcionada por el primer argumento
- ReflectionFunction::invokeArgs() - Invoca los argumentos de una función
- ReflectionMethod::invokeArgs() - Invoca los argumentos