PHP Callback / Callable 类型 学习笔记

实例:

class Test {
    protected $items = array();
    protected $obj;
    public function __construct()
    {
        $this->obj = new Obj();
        $this->items[] = array($this, 'callBackOne');
        $this->items[] = array($this, 'callBackTwo');
        $this->items[] = array($this->obj, 'callObjOne');
        $this->items[] = array($this->obj, 'callObjTwo');
    }

    public function callBackOne()
    {
        echo __METHOD__ . ' has been called as a callback.';
    }

    public function callBackTwo()
    {
        echo __METHOD__ . ' has been called as a callback.';
    }

    public function getItems()
    {
        return $this->items;
    }
}

class Obj{
    public function callObjOne(){
        echo __METHOD__ . ' has been called as a callback.';;
    }
    public function callObjTwo(){
        echo __METHOD__ . ' has been called as a callback.';;
    }
}

$o = new Test();
$itemLists = $o->getItems();

foreach ($itemLists as $itemList) {
    echo '<pre>';
    echo "==========++++++++++=============";
    print_r($itemList);
    print_r($itemList());
    echo '</pre><br>';
}
结果:
==========++++++++++=============Array
(
    [0] => Test Object
        (
            [items:protected] => Array
                (
                    [0] => Array
 *RECURSION*
                    [1] => Array
                        (
                            [0] => Test Object
 *RECURSION*
                            [1] => callBackTwo
                        )

                    [2] => Array
                        (
                            [0] => Obj Object
                                (
                                )

                            [1] => callObjOne
                        )

                    [3] => Array
                        (
                            [0] => Obj Object
                                (
                                )

                            [1] => callObjTwo
                        )

                )

            [obj:protected] => Obj Object
                (
                )

        )

    [1] => callBackOne
)
Test::callBackOne has been called as a callback.

==========++++++++++=============Array
(
    [0] => Test Object
        (
            [items:protected] => Array
                (
                    [0] => Array
                        (
                            [0] => Test Object
 *RECURSION*
                            [1] => callBackOne
                        )

                    [1] => Array
 *RECURSION*
                    [2] => Array
                        (
                            [0] => Obj Object
                                (
                                )

                            [1] => callObjOne
                        )

                    [3] => Array
                        (
                            [0] => Obj Object
                                (
                                )

                            [1] => callObjTwo
                        )

                )

            [obj:protected] => Obj Object
                (
                )

        )

    [1] => callBackTwo
)
Test::callBackTwo has been called as a callback.

==========++++++++++=============Array
(
    [0] => Obj Object
        (
        )

    [1] => callObjOne
)
Obj::callObjOne has been called as a callback.

==========++++++++++=============Array
(
    [0] => Obj Object
        (
        )

    [1] => callObjTwo
)
Obj::callObjTwo has been called as a callback.
综上示例:array($object,$object方法名)()可以直接调用$object方法中对应的方法


class Foo {
    public static function doAwesomeThings() {
        FunctionCaller::callIt(self::class . '::someAwesomeMethod');
    }

    public static function someAwesomeMethod() {
        echo "静态方法Callback/callable类型的调用";
    }
}

class FunctionCaller {
    public static function callIt(callable $func) {
        call_user_func($func);
    }
}

Foo::doAwesomeThings();
执行结果:静态方法Callback/callable类型的调用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值