PHP Callback / Callable 型別 學習筆記
阿新 • • 發佈:2019-01-11
例項:
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型別的呼叫