1. 程式人生 > >PHP Callback / Callable 型別 學習筆記

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型別的呼叫