PHP 8.6.0 Beta 1 is available for testing

call_user_func

(PHP 4, PHP 5, PHP 7, PHP 8)

call_user_funcLlama a una función de retorno proporcionada por el primer argumento

Descripción

function call_user_func(callable $callback, mixed ...$args): mixed

Llama a una función de retorno callback proporcionada por el parámetro callback donde los otros argumentos serán pasados como argumentos.

Parámetros

callback

La función de retorno a llamar.

args

0 o más argumentos a pasar a la función de retorno.

Nota:

Tenga en cuenta que los argumentos para call_user_func() no son pasados por referencia.

Ejemplo #1 Ejemplo con call_user_func() por referencia

<?php
function increment(&$var)
{
 $var++;
}
$a = 0;
call_user_func('increment', $a);
echo $a."\n";
// es posible utilizar esto en su lugar
call_user_func_array('increment', array(&$a));
echo $a."\n";
// también es posible utilizar funciones variables
$increment = 'increment';
$increment($a);
echo $a."\n";
?>

El ejemplo anterior mostrará:

Warning: Parameter 1 to increment() expected to be a reference, value given in ...
0
1
2

Valores devueltos

Retorna el valor retornado por la función de retorno.

Ejemplos

Ejemplo #2 Ejemplo con call_user_func()

<?php
function barber($type)
{
 echo "Usted quiere un corte $type, ningún problema";
}
call_user_func('barber', "al tazón");
call_user_func('barber', "con navaja");
?>

El ejemplo anterior mostrará:

Usted quiere un corte al tazón, ningún problema
Usted quiere un corte con navaja, ningún problema

Ejemplo #3 Ejemplo con call_user_func() utilizando un espacio de nombres

<?php
namespace Foobar;
class Foo {
 static public function test() {
 print "¡Hola mundo!\n";
 }
}
call_user_func(__NAMESPACE__ .'\Foo::test');
call_user_func(array(__NAMESPACE__ .'\Foo', 'test'));
?>

El ejemplo anterior mostrará:

¡Hola mundo!
¡Hola mundo!

Ejemplo #4 Uso de un método de clase con call_user_func()

<?php
class maclasse {
 static function dit_bonjour()
 {
 echo "¡Hola!\n";
 }
}
$classname = "maclasse";
call_user_func(array($classname, 'dit_bonjour'));
call_user_func($classname .'::dit_bonjour');
$monobjet = new maclasse();
call_user_func(array($monobjet, 'dit_bonjour'));
?>

El ejemplo anterior mostrará:

¡Hola!
¡Hola!
¡Hola!

Ejemplo #5 Uso de una función lambda con call_user_func()

<?php
call_user_func(function($arg) { print "[$arg]\n"; }, 'test');
?>

El ejemplo anterior mostrará:

[test]

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.

Véase también

Found A Problem?

Learn How To Improve This PageSubmit a Pull RequestReport a Bug
+add a note

User Contributed Notes 4 notes

up
59
gskluzacek dot nospam at gmail dot com
15 years ago
if you simply want to dynamically call a method on an object it is not necessary to use call_user_function but instead you can do the following:
<?php
$method_name = "AMethodName";
$obj = new ClassName();
$obj->{$method_name}();
?>

I've used the above so I know it works.
Regards,
-- Greg
up
17
Knightnet
18 years ago
You don't need to use this function to call a variable class function. Instead you can do the following:
$this->{$fnname}();
The example works in PHP 5 from within the class. It is the {} that do the trick.
Regards,
Julian.
up
17
Nitrogen
16 years ago
A good use for call_user_func(); is for recursive functions.
If you're distributing code, you will often come across users who will rename functions and break the code..
Use this: call_user_func(__FUNCTION__, ... ); inside a function to call itself with whatever parameters you want.
<?php
// example, an extremely simplified factorial calculator..
// it's quite obvious when someone renames the function, it'll spit out an error because it wants to call itself.
function Factorial($i=1) {
 return($i==1?1:$i*Factorial($i-1));
}
// you can give this function whatever name you want, it'll always work, of course if you initially call it using the name you gave it.
function qwertyuiop($i=1) {
 return($i==1?1:$i*call_user_func(__FUNCTION__,$i-1));
}
?>

Just that I didn't see any reference to recursive functions when user_call_func(); really helps.
up
7
James at enfsolar dot com
6 years ago
<?php
class MyClass{
 public function hello($str)
 {
 echo 'hello ' . $str;
 }
}
$obj = new MyClass();
[$obj, 'hello']('World'); // the array can be called as a function
+add a note

AltStyle によって変換されたページ (->オリジナル) /