简单理解call_user_func和call_user_func_array两个函数

未标题-13.png

call_user_func():调用一个回调函数处理字符串,
  可以用匿名函数,可以用有名函数,可以传递类的方法,
  用有名函数时,只需传函数的名称
  用类的方法时,要传类的名称和方法名
  传递的第一个参数必须为函数名,或者匿名函数,或者方法
  其他参数,可传一个参数,或者多个参数,这些参数会自动传递到回调函数中
  而回调函数,可以通过传参,获取这些参数
  返回回调函数处理后的结果

  ①传递函数名,通过回调函数的形参获取call_user_func传参数的情况

<?php //先引用后增加function _call($call){    //通过传参获取call_user_func传过来的参数    echo $call++,'
';    echo $call++,"
";}//上面回调函数没有返回值,所以,这里就没有返回值,_call为上面的函数的名称$re = call_user_func('_call',1);//实验结果为 null,符合上面的结论var_dump($re);

登录后复制

  ②调用匿名函数传参的情况

<?php //先增加后引用call_user_func(function($call){    echo ++$call,'
';    echo ++$call,'
';},1);//传给匿名函数的参数为···1···,执行的结果为2,3

登录后复制

  ③回调函数是匿名函数,并且匿名函数不设参数,通过其他方式获取参数的情况

$arg1 = 'first';$arg2 = 'two';$return = call_user_func(function(){    $arg = func_get_arg(0); //func_get_arg函数作用:获取函数的第几个参数,必须要有参数,参数必须为函数参数的偏移量,0代表第一个参数    $args = func_get_args();//func_get_args的作用:获取函数所有的参数    if(func_num_args() == 1){//func_num_args函数的作用:获取函数参数的个数,注意,假如函数没有传参,该函数返回0        return $args[0];    }else{        //用|把函数的参数组织成字符串        return implode('|',$args);    }},$arg1,$arg2);var_dump($return);

登录后复制

  ④调用···没有命名空间···的······类方法······的情况

<?php class Func{    //静态方法    static public function _func(){        $str =  'THE CLASS NAME IS '.__CLASS__.' AND CLASS STATIC METHOD IS '.__METHOD__;        if(func_num_args()){            //获取函数参数,获取参数也可以通过给方法设置形参来获取,这里只是没给方法设置形参获取参数的情况            $arg = func_get_arg(0);            return $str.' and argument is '.$arg;        }else{            return $str;        }    }    //普通方法    public function __func($num){        return $num ? $num+1:$num;    }}//传递类的静态方法,有两种方式//(1)种,传递····类名::方法名····var_dump(call_user_func("Func::_func",'hell world'));//这里传递参数//(2)种,传递类名和方法名的数组var_dump(call_user_func(array('Func','_func')));//这里没有传参数$num = 4;$o = new Func;//传递类普通方法必须用···数组···传递···该类的对象··和···方法名···$return = call_user_func(array($o,'__func'),$num);var_dump($return);

登录后复制

  ⑤调用·····有命名空间的·······类方法·········的情况

<?php //定义类的命名空间namespace Home;class Space{    //静态方法    static public function _call($num){        return $num +=10;    }    //普通方法    public function _func(){        return func_get_args();//返回函数的参数    }}//针对静态方法,有两种调用方式//1.可以用array(__NAMESPACE__.'类名','方法名')传递类方法,也就是:array('命名空间类名','方法名')$return = call_user_func(array(__NAMESPACE__.'Space','_call'),10);//2.可以用····    __NAMESPACE__.'类名::方法名'    ···传递类方法,也就是:'命名空间类名::方法名'$return1 = call_user_func('HomeSpace::_call',100);var_dump($return);var_dump($return1);//针对普通方法,不用传入命名空间即可调用,如下$o = new Space;$return = call_user_func(array($o,'_func'),1,2,3,4,5);var_dump($return);

登录后复制

 

  call_user_func函数是php引用匿名函数的一种方式,php不像js那样,可以把匿名函数赋值给变量并引用,但可以通过call_user_func函数来调用匿名函数,这也能做到局部变量不被全局污染,call_user_func调用的回调函数不仅仅是我们自定义的函数,还可以是php处理字符串的系统函数,如rtrim、explode的,在调用这些系统函数时,需要注意的是,call_user_func传递的参数必须符合系统函数的传参顺序,你自己可以试着调用一下,举个例子:调用rtrim和explode函数。下面的例子本人试过,是可行的(php视频教程)

<?php $return = call_user_func('rtrim','sso;osoo;',';');$return2 = call_user_func('explode',';','sso;osoo;');var_dump($return);var_dump($return2);

登录后复制

  与call_user_func函数类似的还有一个call_user_func_array函数,这个函数的调用和作用和call_user_func函数基本一样,所不同的是,call_user_func_array函数只能传递两个参数,第一个是回调函数名,或者匿名函数,或者类方法,第二个参数则是数组,从这里也可以看出,其实call_user_func_array函数与call_user_func不同的是,call_user_func_array是利用回调函数处理数组,而call_user_func则是利用回调函数处理字符串,他们两个的根本差别就在这里了。你自己可以尝试的调用call_user_func_array()函数,因为它们的引用基本一样,所以关于call_user_func_array就不再多写了。

以上就是简单理解call_user_func和call_user_func_array两个函数的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2161198.html

(0)
上一篇 2025年2月25日 07:52:57
下一篇 2025年2月25日 07:53:13

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 180多个PHP常用函数总结

    我们知道任何有效的 php 代码都有可能出现在函数内部,甚至包括其它函数和类定义。本文我们主要和大家分享180多个PHP常用函数总结,希望能帮助大家更高效的学习PHP。 数学函数 1.abs(): 求绝对值 $abs = abs(-4.2)…

    数据库 2025年4月29日
    000
  • vscode如何自动生成函数注释与文件头部注释

    1、安装插件KoroFileHeader 2、设置 在vscode左下角点击设置按钮,选择“设置”,然后输入“fileheader” 文件头部注释:Fileheader:custom Made 函数注释:Fileheader:cursor …

    2025年4月2日 编程技术
    100
  • 零基础入门Vue3函数:快速掌握Vue3的核心方法

    随着前端技术的不断发展,vue.js已经成为一个非常流行的前端框架。在vue.js的最新版本vue 3中,新的函数和方法被引入并且现有的函数和方法也得到了升级。在这篇文章中,我们将介绍一些vue 3的核心函数和方法,帮助读者快速入门vue …

    编程技术 2025年4月1日
    100
  • Vue3函数大全:完整介绍Vue3中的所有函数

    vue3是目前前端开发中最受欢迎的框架之一,它的主要开发语言是javascript。vue3具有诸多优点,如高效、快速、易学等,能够帮助开发者更加轻松地实现复杂的web应用程序。 Vue3包含了大量的函数,这些函数可以帮助开发者更好地实现应…

    编程技术 2025年4月1日
    200
  • Vue3函数详解:让你快速上手Vue3开发

    vue3是vue框架的最新版本,与vue2相比,在性能、api、typescript支持等方面都有很大的改进。因此,vue3已经成为了前端开发中的热门话题。作为前端开发人员,如果你想掌握vue3的开发技能,那么你需要对其中的函数进行了解和掌…

    编程技术 2025年4月1日
    100
  • Vue3中的调试工具函数:让你更方便的调试Vue3代码

    vue3是一款流行的javascript框架,它由于其易用性和灵活性而受到了众多开发人员的欢迎。而对于开发者来说,调试代码是一项不可或缺的工作,好的调试工具可以帮助我们事半功倍。在vue3中,我们可以使用一些实用的调试工具函数来更方便地调试…

    编程技术 2025年4月1日
    100
  • Vue文档中的路由守卫函数的介绍

    vue是一款流行的前端框架,它提供了许多强大的功能,其中之一就是路由守卫函数。路由守卫函数是vue路由的一项重要功能,用于在导航到或离开某个路由时执行控制逻辑。路由守卫函数允许您控制路由的读取和修改,以及根据各种条件来进行路由导航。本文将介…

    编程技术 2025年4月1日
    100
  • Vue文档中的过滤器函数的介绍

    vue是一款流行的javascript框架,它为开发者提供了非常强大的工具来构建交互式的web应用程序。其中一个vue框架中的常用功能就是过滤器函数。在本文中,我们将介绍vue文档中的过滤器函数及其使用方式。 一、什么是Vue过滤器函数? …

    编程技术 2025年4月1日
    200
  • Vue文档中的数据格式化函数详细介绍

    vue.js是一款前端框架,它提供了一系列的数据绑定和响应式更新机制,通过这些特性,vue.js能够让我们更加快速、便捷地开发web应用。其中,数据格式化函数是vue.js提供的一个非常实用的工具,它可以帮助我们对数据进行格式化,并以一种更…

    编程技术 2025年4月1日
    200
  • Vue文档中的分页面跳转函数实例分析

    vue.js是一个开源的javascript框架,是构建用户界面的渐进式框架,具有高效、灵活、易用等优点。在vue.js的文档中,有一个非常有用的分页面跳转的函数,即$router.push(),本文将对此函数进行详细分析。 $router…

    编程技术 2025年4月1日
    200

发表回复

登录后才能评论