【php 之根据函数名称动态调用该函数】
解释函数:call_user_func()以及函数call_user_func_array()
对于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
?>
【php 之根据函数名称动态调用该函数】的更多相关文章
- 动态调用DLL函数有时正常,有时报Access violation的异常
动态调用DLL函数有时正常,有时报Access violation的异常 typedef int (add *)(int a,int b); void test() { hInst=LoadL ...
- 如何动态调用 C 函数
JSPatch 支持了动态调用 C 函数,无需在编译前桥接每个要调用的 C 函数,只需要在 JS 里调用前声明下这个函数,就可以直接调用: require('JPEngine').addExtensi ...
- VC++线程函数内怎么调用外部函数
VC++线程函数内怎么调用外部函数 1.把外部函数做成静态函数,就可以直接调用了.2.把外部函数所在的对象通过线程函数参数传到线程里面来,这样线程里可以使用此对象及其函数了.
- day12 函数的嵌套调用 闭包函数,函数对象
函数嵌套: 函数嵌套: 嵌套指的是,一个物体包含另一个物体,函数嵌套就是一个函数包含另一个函数 按照函数的两个阶段 嵌套调用 指的是在函数的执行过程中调用了另一个函数,其好处可以简化外层大函数的代码, ...
- java mysql自定义函数UDF之调用c函数
正如sqlite可以定义自定义函数,它是通过API定义c函数的,不像其他,如这里的mysql.sqlite提供原生接口就可以方便的调用其他语言的方法,同样的mysql也支持调用其它语言的方法. goo ...
- python27期day10:函数的动态参数、函数的注释、函数的名称空间、函数的嵌套、global(修改全局的)、nonlocal(修改局部的)、函数名的第一类对象及使用、作业题。
1.动态参数的作用: 能够接收不固定长度参数 位置参数过多时可以使用动态参数 * args是程序员之间约定俗称(可以更换但是不建议更换) * args获取的是一个元组 ** kwargs获取的是一个字 ...
- self指向函数地址 动态调用函数的简单例子
#import <Foundation/Foundation.h> @interface Person : NSObject - (void)test1; - (void)test2:(N ...
- 几种动态调用js函数方案的性能比较
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 写一个dup2功能相同的函数,不能调用 fcntl 函数,并且要有出错处理
实现的时候用到系统原来的dup函数 // mydup2.c // 2015/08/17 Lucifer Zhang version1.0 // write my own dup2 function / ...
随机推荐
- day03-变量
Python中的变量类型有: int:带正负号的整数long:在python2中表示长整数,在python3中被放弃complex:复数str:字符串True,False:布尔list:列表dict: ...
- 使用Docker容器的十大误区
转自:http://www.dockone.io/article/1264 对于用户来说,可能一开始在不了解的情况下会对容器报以拒绝的态度,但是在尝到容器的甜头.体验到它的强大性能之后,相信大家最终是 ...
- C#实现联合体
[StructLayout(LayoutKind.Explicit, Size = )] public struct TypeTransform { [FieldOffset()] public fl ...
- Haskell语言学习笔记(70)NonEmpty
NonEmpty(非空列表) infixr 5 :| data NonEmpty a = a :| [a] deriving (Eq, Ord) instance Functor NonEmpty w ...
- Kotlin语言学习笔记(3)
数据类(Data Classes) data class User(val name: String, val age: Int) 编译器自动生成的有: equals()/hashCode() toS ...
- webpack异步加载业务模块
虽然把我们用到的JS文件全部打包一个可以节省请求数,但如果打包后的JS文件过大,那么也容易出现白屏现象,许多操作失灵.而且一些区域是点到才出现,那么相关的JS其实可以剥离出这个大JS文件外.这就涉及到 ...
- CentOS 7下源码安装zabbix服务
安装环境需要LAMP或者LNMP先搭建好 在此我使用上一篇搭建好的LNMP环境来安装zabbix 1.下载zabbix http://www.zabbix.com/download.php 2.安装及 ...
- KVM虚拟化技术(一)虚拟化简介
一 .虚拟化 虚拟化是指计算机元件在虚拟的基础上而不是真实的基础上运行.虚拟化技术可以扩大硬件的容量,简化软件的重新配置过程.CPU的虚拟化技术可以单CPU模 拟多CPU并行,允许一个平台同时运行多个 ...
- Apache tica详述
Tika是一个内容抽取的工具集合(a toolkit for text extracting).它集成了POI, Pdfbox 并且为文本抽取工作提供了一个统一的界面.其次,Tika也提供了便利的扩展 ...
- 吴裕雄 python深度学习与实践(5)
import numpy as np data = np.mat([[1,200,105,3,False], [2,165,80,2,False], [3,184.5,120,2,False], [4 ...