PHP Callback / Callable 类型

蘑菇| 阅读:5 发表时间:2017-06-29 16:05 语言

自 PHP 5.4 起可用 callable 类型指定回调类型 callback。本文档基于同样理由使用 callback 类型信息。


一些函数如call_user_func()或usort()可以接受用户自定义的回调函数作为参数。回调函数不止可以是简单函数,还可以是对象的方法,包括静态类方法。


传递

PHP是将函数以string形式传递的。 可以使用任何内置或用户自定义函数,但除了语言结构例如:array(),echo,empty(),eval(),exit(),isset(),list(),print 或 unset()。


一个已实例化的object的方法被作为array传递,下标0包含该object,下标1包含方法名。在同一个类里可以访问protected和private方法。


静态类方法也可不经实例化该类的对象而传递,只要在下标 0 中包含类名而不是对象。自 PHP 5.2.3 起,也可以传递 'ClassName::methodName'。


除了普通的用户自定义函数外,也可传递 匿名函数 给回调参数。

// 一个回调函数
function my_callback_function()
{
    echo 'hello world!';
}

// 一个回调方法
class MyClass{
    static function myCallbackMethod()
    {
        echo 'hello world!';
    }
}

// 回调自定义函数
call_user_func('my_callback_function');

// 回调类的静态方法
call_user_func(array('MyClass', 'myCallbackMethod'));

// 回调对象的方法
$obj = new MyClass();
call_user_func(array($obj, 'myCallbackMethod'));

// As of PHP 5.2.3
call_user_func('MyClass::myCallbackMethod');

// 上述都输出 hello world!


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
call_user_func(array('B', 'who'));  // B


class C{
    public function __invoke($name)
    {
        echo 'Hello '.$name."\n";
    }
}

$c = new C();
call_user_func($c, 'PHP!');     // Hello PHP!
版权声明:
1.本文仅代表作者观点,不代表蒙奇蘑菇的立场。
2.本文系作者授权蒙奇蘑菇发表,未经许可,不得转载。如有侵权,请联系本站删除。