PHP 8.4.1 Released!

call_user_func

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

call_user_funcCall the callback given by the first parameter

Опис

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

Calls the callback given by the first parameter and passes the remaining parameters as arguments.

Параметри

callback

The callable to be called.

args

Zero or more parameters to be passed to the callback.

Зауваження:

Note that the parameters for call_user_func() are not passed by reference.

Приклад #1 call_user_func() example and references

<?php
error_reporting
(E_ALL);
function
increment(&$var)
{
$var++;
}

$a = 0;
call_user_func('increment', $a);
echo
$a."\n";

// it is possible to use this instead
call_user_func_array('increment', array(&$a));
echo
$a."\n";

// it is also possible to use a variable function
$increment = 'increment';
$increment($a);
echo
$a."\n";
?>

Поданий вище приклад виведе:

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

Значення, що повертаються

Returns the return value of the callback.

Приклади

Приклад #2 call_user_func() example

<?php
function barber($type)
{
echo
"You wanted a $type haircut, no problem\n";
}
call_user_func('barber', "mushroom");
call_user_func('barber', "shave");
?>

Поданий вище приклад виведе:

You wanted a mushroom haircut, no problem
You wanted a shave haircut, no problem

Приклад #3 call_user_func() using namespace name

<?php

namespace Foobar;

class
Foo {
static public function
test() {
print
"Hello world!\n";
}
}

call_user_func(__NAMESPACE__ .'\Foo::test');
call_user_func(array(__NAMESPACE__ .'\Foo', 'test'));

?>

Поданий вище приклад виведе:

Hello world!
Hello world!

Приклад #4 Using a class method with call_user_func()

<?php

class myclass {
static function
say_hello()
{
echo
"Hello!\n";
}
}

$classname = "myclass";

call_user_func(array($classname, 'say_hello'));
call_user_func($classname .'::say_hello');

$myobject = new myclass();

call_user_func(array($myobject, 'say_hello'));

?>

Поданий вище приклад виведе:

Hello!
Hello!
Hello!

Приклад #5 Using lambda function with call_user_func()

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

Поданий вище приклад виведе:

[test]

Примітки

Зауваження:

Зворотні виклики, зареєстровані через функції call_user_func() і call_user_func_array(), не будуть викликатись при наявності неспійманих винятків, викинутих в попередніх зворотніх викликах.

Прогляньте також

add a note

User Contributed Notes 4 notes

up
55
gskluzacek dot nospam at gmail dot com
14 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
19
Knightnet
17 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
19
Nitrogen
15 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
6
James at enfsolar dot com
4 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
To Top