PHP手册之Callback 回调类型

2018-03-20  本文已影响0人  killtl

前言

PHP手册系列文章,会挑选一些手册中有意思的评论进行翻译
手册目录:语言参考---类型---Callback回调类型
参考详情

评论

  1. 可以使用self::methodName作为一个回调函数,但是这样做是很危险的
class Foo {
    public static function doAwesomeThings() {
        FunctionCaller::callIt('self::someAwesomeMethod');
    }

    public static function someAwesomeMethod() {
        // fantastic code goes here.
    }
}

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

Foo::doAwesomeThings();
}

运行出错:class 'FunctionCaller' does not have a method 'someAwesomeMethod'.因为FunctionCaller并不知道self对应着Foo

基于此,你应该始终使用全类名进行调用,如下:

FunctionCaller::callIt('Foo::someAwesomeMethod');
  1. 当你指明类的方法以数组的形式回调时(例如.array($this,'myFunc')),回调的方法可以是私有的,但此种情况只适用于类内调用,如果类外调用私有方法将会报错
class mc {
   public function go(array $arr) {
       array_walk($arr, array($this, "walkIt"));
   }

   private function walkIt($val) {
       echo $val . "<br />";
   }

    public function export() {
        return array($this, 'walkIt');
    }
}

$data = array(1,2,3,4);

$m = new mc;
$m->go($data); // valid

array_walk($data, $m->export()); // 将会产生警告

输出:1<br />2<br />3<br />4<br />
warning:array_walk() expects parameter 2 to be a valid callback, cannot access private method mc::walkIt() in /in/tfh7f on line 22.

  1. 你可以使用$this来指定一个回调函数
class MyClass {
    public $property = 'Hello World!';
    public function MyMethod()
    {
        call_user_func(array($this, 'myCallbackMethod'));
    }

    public function MyCallbackMethod()
    {
        echo $this->property;
    }
}
  1. 可以像回调一个方法那样回调一个实现了__invoke()魔术方法的对象,__invode()方法会在你尝试以调用函数的形式调用对象时被自动调用
class CallableClass 
{
    function __invoke($x) {
        var_dump($x);
    }
}
$obj = new CallableClass;
call_user_func($obj, 5);   //以函数的形式进行调用,会调用__invoke(),输出int(5)
var_dump(is_callable($obj));   //是callable类型的
上一篇 下一篇

猜你喜欢

热点阅读