laravel框架中的一个函数为啥可以这样用

clipboard.png
call_user_func()函数,我跟他一样用,写了个例子,但是会出现warning错误,

call_user_func() expects parameter 1 to be a valid callback, no array or string given in /Users/xxx/workplace/test/aa.php

在网上也没有搜到它这种用法,求教?

阅读 3.4k
3 个回答

clipboard.png

getInitializer 方法返回的是一个Closure对象, 所以无问题; 你确定自己写的方法返回的类型是Callable 类型?

例1:

function test() {
    echo "hello test";
}
call_user_func(function(){
    test();
});
//或者以字符串形式传入函数名
call_user_func("test");

碰到类中方法调用应该传入一个array

class Foo {
    public function bar() {
        echo "Hello bar!";
    }
}
$obj = new Foo();
call_user_func(array($obj, "bar"));

那么再看一个例子

<?php

class Foo {
    public static function getInitializer() {
        return "hello";
    }
}

function hello() {
    echo "world!";
}

call_user_func(Foo::getInitializer());

如果将上面例子中return改成echo,就会出现你所描述的错误,而hello也会被输出。

而在composer的getInitializer方法中返回的是个Closure对象,自然也被call_user_func所接受。

call_user_func

(PHP 4, PHP 5, PHP 7)
call_user_func — 把第一个参数作为回调函数调用

说明 ¶

mixed call_user_func ( callable $callback [, mixed $parameter [, mixed $... ]] )
第一个参数 callback 是被调用的回调函数,其余参数是回调函数的参数。
这个和call_user_func_array函数是同胞函数,也可以研究一下

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题