Passing
A PHP function is passed by its name as a string. Any built-in
or user-defined function can be used, except language constructs such as:
array, echo,
empty, eval,
exit, isset,
list, print or
unset.
A method of an instantiated object is passed as an
array containing an object at index 0 and the
method name at index 1. Accessing protected and private methods from
within a class is allowed.
Static class methods can also be passed without instantiating an
object of that class by either, passing the class name
instead of an object at index 0, or passing
'ClassName::methodName'
.
Apart from common user-defined function,
anonymous functions and
arrow functions can also be
passed to a callback parameter.
Note:
As of PHP 8.1.0, anonymous functions can also be created using the first class callable syntax.
Generally, any object implementing __invoke() can also
be passed to a callback parameter.
Example #1
Callback function examples
<?php
// An example callback function
function my_callback_function() {
echo 'hello world!';
}
// An example callback method
class MyClass {
static function myCallbackMethod() {
echo 'Hello World!';
}
}
// Type 1: Simple callback
call_user_func('my_callback_function');
// Type 2: Static class method call
call_user_func(array('MyClass', 'myCallbackMethod'));
// Type 3: Object method call
$obj = new MyClass();
call_user_func(array($obj, 'myCallbackMethod'));
// Type 4: Static class method call
call_user_func('MyClass::myCallbackMethod');
// Type 5: Relative static class method call
class A {
public static function who() {
echo "A\n";
}
}
class B extends A {
public static function who() {
echo "B\n";
}
}
call_user_func(array('B', 'parent::who')); // A, deprecated as of PHP 8.2.0
// Type 6: Objects implementing __invoke can be used as callables
class C {
public function __invoke($name) {
echo 'Hello ', $name, "\n";
}
}
$c = new C();
call_user_func($c, 'PHP!');
?>
Example #2
Callback example using a Closure
<?php
// Our closure
$double = function($a) {
return $a * 2;
};
// This is our range of numbers
$numbers = range(1, 5);
// Use the closure as a callback here to
// double the size of each element in our
// range
$new_numbers = array_map($double, $numbers);
print implode(' ', $new_numbers);
?>
The above example will output:
Note:
Callbacks registered
with functions such as call_user_func and call_user_func_array will not be
called if there is an uncaught exception thrown in a previous callback.