解读PHP中的call_user_func_array和is_callable函数
本帖发布于 1个月前

在《从构造一个开源的微信sdk开始》课程的【对客户端消息返回一个文本】中涉及了两个PHP函数is_callable和call_user_func_array,可能很多同学不熟悉,这里进行一下讲解。

begin...

is_callable

验证变量的内容能否作为函数调用。这可以检查包含有效函数名的变量,或者一个数组,包含了正确编码的对象以及函数名。

不太明白是吧,我们用例子说明。

先贴下函数原型

/**
 * 如果 name 可调用则返回 TRUE,否则返回 FALSE。
 */
bool is_callable ( callable $name [, bool $syntax_only = false [, string &$callable_name ]] )

检测一个函数是否可以调用

接下来我们使用它,比如

$abc = function(){
  echo "hello";
}

var_dump(is_callable($abc));

返回真,代表当前$abc这个函数可以调用,接下来继续看

<?php
class User {
    public function hello(){
        echo "hello";
    }

    private function say(){
        echo "say";
    }

    static public function sayHello(){
        echo "say-hello";
    }
}

$model = new User();
var_dump(is_callable([$model,"hello"]));
var_dump(is_callable([$model,"say"]));
var_dump(is_callable([$model,"sayHello"]));

我们来看下结果

alt

正如is_callable名字一样,它验证一个函数当前是否可以被调用,这种调用除了函数确实存在外还会检测当前情境下是否可见,因此类的私有函数say()返回了false,因此它不可见,而公用方法hello和sayHello则可以。

这不由让我们想到了另一个很常用的函数method_exists,看下面代码

var_dump(method_exists($model,"hello"));
var_dump(method_exists($model,"say"));
var_dump(method_exists($model,"sayHello"));

method_exists就没那么贴心了,看结果

alt

method_exists($model,"say")返回真,但是我们是不能调用它的。

总结

method_exists仅仅判断一个函数是否存在,is_callable除此之外还能检查当前情境下此函数是否可见。

call_user_func_array

调用回调函数,并把一个数组参数作为回调函数的参数,返回结果就是这个回调函数接收参数后的处理结果。

function hello($num,$brother){
    echo "hello {$num}个{$brother}";
}

echo call_user_func_array("hello",[12,"东方不败"]);

先看结果再说话

alt

要注意,参数数组得是索引数组。

另外如果给回调函数传递的参数数组大于函数参数数量,后面都会被舍弃,如果小于参数数量,那就报错了~~~

你明白了么?

以上就是上面两个方法的使用情况,阿北强烈建议各位学员针对此课在看一遍视频,对它们会有更好的理解。

微信扫码访问小程序版
本作品采用署名-非商业性使用-禁止演绎 4.0 国际许可协议 进行许可 。
北哥小报

扫码关注我的订阅号,不定时推送除了代码外的事情,比如时间管理、书单等。

yii2-wx
1 篇帖子

这可能是yii2中最好用的微信SDK🔥🔥🔥 https://github.com/abei2017/yii2-wx