PHP 函数之 call_user_func & call_user_func_array[通俗易懂]

PHP 函数之 call_user_func & call_user_func_array

大家好,又见面了,我是全栈君。

call_user_func_array (callable $callback, array $param_arr)

參数1: 调用一个回调函数, 

參数2: 数组參数是回调函数的參数.

call_user_func(callable $callback, $mixed $parameter, $mixed $…)

參数1:调用的回调函数

參数2-n:回调函数的參数.


比較这两者的不同哦. 前者的第二个參数必须是 数组.

情况一:调用普通的函数.

<?

phpfunction barber($type){ echo "You wanted a $type haircut, no problem\n";}call_user_func('barber', "mushroom");call_user_func('barber', "shave");?>

这里,第一个參数直接指定函数的名称.

<?

phpfunction barber($type){ echo "You wanted a $type haircut, no problem\n";}call_user_func_array('barber', array("mushroom"));call_user_func_array('barber', array("shave"));?>

还是比較一下这两者之间的不同.

看出来的请继续.

情况二: 调用类中的静态函数.

以下是call_user_func_arr

namespace Foo;
class F {
	public static function showName ($name) {
		return strtoupper($name);
	}
}
echo call_user_func_array(__NAMESPACE__.'\F::showName', array('vein'));
echo call_user_func_array(array(__NAMESPACE__.'\F', 'showName'), array('vein'));
$f = new F();
echo call_user_func_array(array($f, 'showName'), array('vein'));

以下是call_user_func 

namespace Foo;
class F {
	public static function showName ($name) {
		return strtoupper($name);
	}
}
echo call_user_func(__NAMESPACE__ . '\F::showName','vein');
echo call_user_func(array(__NAMESPACE__ . '\F','showName'),'vein');

$f = new F();
echo call_user_func(array($f, 'showName'),'vein');	

情况三:动态方法调用

call_user_func

namespace Foo;
class F {
	public function showAge ($age) {
		return $age + 100;
	}
}
call_user_func(__NAMESPACE__ . '\F::showAge',23);

这里要注意一点,假设这样调用的话,系统会报错,提示

call_user_func() expects parameter 1 to be a valid callback, non-static method Foo\F::showAge() should not be called s
tatically

解释一下: 这个函数的第一个參数必须是 有效的回调函数, 非静态的方法showAge() 是不同意调用的.

须要的解决方式是:

namespace Foo;
class F {
	public static function showName ($name) {
		return strtoupper($name);
	}

	public function showAge ($age) {
		return $age + 100;
	}
}
$f = new F(); 
echo call_user_func(array($f, 'showAge'),23);

对于这种动态函数的调用,必须提前进行对象实例化,

然后将实例化之后的对象传入函数作为第一个參数.

call_user_func_array :

namespace Foo;
class F {
	public static function showName ($name) {
		return strtoupper($name);
	}

	public function showAge ($age) {
		return $age + 100;
	}
}
$f = new F(); 
echo call_user_func_array(array($f, 'showAge'),array(23));

这样也是可行的.

总结一下: call_user_func_array 和 call_user_func 两个函数基本上是类似的,仅仅是在调用上传递參数时存在一些差异.

记住一点,call_user_func_array 传递的第二个參数必须是数组,

call_user_func 传递的第二个參数可能是数组.假设是多个參数的话,还是须要以列表的形式列出.


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

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115340.html原文链接:https://javaforall.net

(0)
上一篇 2022年2月5日 下午8:00
下一篇 2022年2月5日 下午8:00


相关推荐

  • MongoDB高级操作(管道聚合)

    MongoDB高级操作(管道聚合)一、 聚合aggregate聚合(aggerate)主要用于计算数据,类似于SQL中的sum(),avg(),聚合aggregate是基于数据处理的聚合管道,每个文档通过一个由多个阶段(stage)组成的管道,可以对每个阶段的管道进行分组、过滤等功能,然后经过一系列的处理,输出相应的结果。方法:db.stu.aggergate({管道:{表达式}}),如图:二、管道(grep)在Mon…

    2025年8月4日
    3
  • 从工具精通到商业变现:AI浪潮下,为何多数人止步于“收藏家”?

    从工具精通到商业变现:AI浪潮下,为何多数人止步于“收藏家”?

    2026年3月17日
    1
  • vim替换区分大小写_word英文大小写切换

    vim替换区分大小写_word英文大小写切换利用vim的正则表达式模块下面的代码是,全文变成小写,:%s/.*/\L&/g\L是小写;\U是大写;&&是正则表达式全部匹配项,其他的还有:\1,\2,\3,…,\9。表示第1,2,3…9个匹配项。比如说想替换“abcxxxxabcxxxxxabc”为“ABCxxxxABCxxxxxABC”输入如下命令:%s/abc/\U&/g比如像替换“{ABC}xxxx{

    2025年11月24日
    6
  • 安卓端口占用_查看端口号命令

    安卓端口占用_查看端口号命令android查看端口号被占用

    2022年7月27日
    7
  • SQL server 2008 r2 安装教程[通俗易懂]

    SQL server 2008 r2 安装教程[通俗易懂]1、下载sqlserver2008r2的安装包(如果需要安装包可以私我,密钥自动输入)2、打开安装包,点击setup.exe3、点击“安装”,下一步选择“全新安装或向现有的安装添加功能”4、检测完成后点击确定5、选择输入产品密钥,这里会自动输入,下一步6、选择“我接受许可条款”,下一步7、选择“安装”8、检测无误后,点击“下一步”9、选择”SQLserver功能安装“,点击”下一步“10、这里全选,我这里选择的是默认路径c盘的,也可以选择放在其他目录下。点击”下一步

    2022年6月23日
    115
  • 谷歌离线地图开发教程视频_2019谷歌卫星地图高清版下载

    谷歌离线地图开发教程视频_2019谷歌卫星地图高清版下载bigemap如何发布google离线地图及二次开发API1.说明bigemap离线地图开发环境支持谷歌地图、百度地图、高德地图等等所有常用地图类型,支持在局域网内的地图部署、二次开发。2.实现第一步:下载安装离线地图开发环境BIEGMAP离线地图服务器(开发版)下载安装好之后,启动软件,如下图所示:①如果你的电脑连接到网络,这里可以直接点击…

    2025年11月24日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号