当前位置: 首页 > 技术随笔 > PHP根据函数名称动态调用该函数

PHP根据函数名称动态调用该函数

对于PHP程序员而言,函数是再熟悉不过的事物了,毕竟我们整天都在和PHP内置函数以及我们自定义的函数打交道。一般情况下,我们想要调用一个函数直接在PHP代码中写上该函数的名称,后面加上一对小括号即可。譬如,我们要调用自己编写的用于计算两个数之和的add()函数,调用示例代码如下:

<?php
//计算两个数的和,并返回计算结果
function add($a, $b){
	return $a + $b;	
}

$num1 = 1;
$num2 = 3;
echo add($num1, $num2);	//调用add()函数,并传递进对应的参数
//输出:4
?>

不过,如果我们有两个函数add()(计算两个数的和)和minus()(计算两个数的差),并且我们希望,用户输入对应的函数名称,我们就调用对应的函数,这个时候该怎么做呢?当然,有些程序员可能会想到使用如下方法来实现:

<?php
//计算两个数的和,并返回计算结果
function add($a, $b){
	return $a + $b;	
}

//计算两个数的查,并返回计算结果
function minus($a, $b){
	return $a - $b;	
}

$function_name = 'add';	//这里模拟用户的输入
$num1 = 3;
$num2 = 5;

//根据函数名称字符串执行对应方法
switch ($function_name){
	case 'add':
		add($num1, $num2);
		break;
	case 'minus':
		minus($num1, $num2);
		break;
	default:
		//...
		break;
}
?>

上面这样做,是没有错的。不过,这里只是两个函数的情况,如果用户可以自行输入的函数名称非常多,难道我们只能老老实实地去写类似上面例子中的一个个case子句?此外,如果我们想要实现用户输入任何一个函数名称,不管是PHP内置的函数还是我们自己定义的函数,只要该函数存在,用户就可以通过输入对应的函数名称来调用,这个时候我们该怎么办呢?有没有一种方法能够实现:只要用户输入一个函数名称和参数,我们就直接根据函数名称调用对应的函数呢?

不用再想了,PHP已经给我们提供了能够实现上述功能的函数——call_user_func()call_user_func_array()。我们只需要将函数名称作为第一个参数,调用该函数所需的参数作为第2~N个参数传递给call_user_func()即可(call_user_func_array()与此类似,不过除了作为函数名称的第一个参数外,后面调用函数所需的参数是以数组的形式整体传递进去的)。

这里,我们可以参考一个具体的示例:

<?php
//计算两个数的和,并返回计算结果
function add($a, $b){
	return $a + $b;	
}

//计算两个数的查,并返回计算结果
function minus($a, $b){
	return $a - $b;	
}

$function_name = 'add';	//这里模拟用户的输入
$num1 = 3;
$num2 = 5;

//调用自定义函数
echo call_user_func($function_name, $num1, $num2);	//输出:8
echo call_user_func_array($function_name, array($num1, $num2)); //输出:8

//调用PHP内置函数
echo call_user_func('pow', 3, 2);	//相当于pow(3, 2),输出:9
echo call_user_func_array('pow', array(3, 2));	//相当于pow(3, 2),输出:9


//如果函数不需要传入参数,直接传入函数名称即可
echo call_user_func('pi');	//相当于pi(),输出:3.1415926535898
?>
1 0
我们认为: 用户的主要目的,是为了获取有用的信息,而不是来点击广告的。因此本站将竭力做好内容,并将广告和内容进行分离,确保所有广告不会影响到用户的正常阅读体验。用户仅凭个人意愿和兴趣爱好点击广告。
我们坚信:只有给用户带来价值,用户才会给我们以回报。
CodePlayer技术交流群1CodePlayer技术交流群1

帮朋友打一个硬广告:

P2P网贷系统(Java版本) 新年低价大促销,多年P2P技术积累,系统功能完善(可按需定制,可支持第三方存管、银行存管),架构稳定灵活、性能优异、二次开发快速简单。 另可提供二次开发、安装部署、售后维护、安全培训等一条龙服务。

外行看热闹,内行看门道。可以自信地认为,在系统设计上,比市面上的晓风、迪蒙、方维、绿麻雀、国融信、金和盛等P2P系统要好。
深圳地区支持自带技术人员现场考察源代码、了解主要技术架构,货比三家,再决定是否购买。

也可推荐他人购买,一旦完全成交,推荐人可获得实际售价 10% 的返现。
有意向者,详情请 点击这里 联系,工作时间立即回复。