(PHP 4, PHP 5, PHP 7, PHP 8)
call_user_func — Llama a una función de retorno proporcionada por el primer argumento
Llama a una función de retorno callback
proporcionada por el parámetro callback
donde los otros argumentos serán pasados como argumentos.
callbackLa 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
Retorna el valor retornado por la función de retorno.
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]
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.
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,
-- GregYou 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.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.<?php
class MyClass{
public function hello($str)
{
echo 'hello ' . $str;
}
}
$obj = new MyClass();
[$obj, 'hello']('World'); // the array can be called as a function