【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 / ...
随机推荐
- Xshell 公钥登入服务器
1:生成公钥 此时有test.pub文件 2:linux CentOS 7 配置 2.1 test.pub 存入/root/test.pub目录下面 2.2 确保authorized_keys文件内容 ...
- Nginx代理webSocket经常中断的解决方案, 如何保持长连接
背景 这天气够热的,要处理的事情也够多的.... 1 2 想看解决的,直接 ctrl+f搜索关键字‘配置点’ 开始前交代(想看原因的看这个,个人观点,不代表正确) 解说:今天用nginx反代通讯项目, ...
- linux MYSQL大小写问题处理
1)window下默认大小写不敏感,所以在window下.创建表 test后再想创建表TEST会报错.而linux下默认可以.认为是不同的两张表 2)linux创建数据库,安装完毕后 首要任务是在li ...
- bash中 2>&1 & 的解释
1.首先,bash中0,1,2三个数字分别代表STDIN_FILENO.STDOUT_FILENO.STDERR_FILENO,即标准输入(一般是键盘),标准输出(一般是显示屏,准确的说是用户终端控制 ...
- linux thread_info 与thread_struct
有个同事看3.10代码中,看着两个结构,会混淆,所以我简单答复了一下. thread_info是和内核栈放一块的,网上到处都是thread_info的资料,但thread_struct的资料比较少,在 ...
- centOS6.6网络设置
linux的网卡IP地址是存放在文件中的,这个配置文件在/etc/sysconfig/network-scripts下, 名称分别为ifcfg-eth0,ifcfg-eth1等 如果你只有一块网卡,就 ...
- Structs复习 ActionMethod
action在执行的是时候 可以不执行excute方法 可以由自己制定 可以在action标签里指定 也可以在方法里动态指定 推荐使用后者 jar包 web.xml <?xml version ...
- SQL调用C# dll(第二中DLL,强名称密匙)
参考:微软官网 https://msdn.microsoft.com/zh-cn/library/ms345106(es-es).aspx 1.新建项目 SQLDllTestUsingNew Clas ...
- 环境变量之path的一点理解
最初安装java环境时一直不明白为什么要配置环境变量,百度了一下还是理解不透彻. 后来安装python时也要配置环境变量.. 在经过未配置和配置的操作后,才有些理解path的含义. 1.未配置环境变量 ...
- 05_ssm基础(四)之Spring基础二
24.spring配置dbcp并完成CRUD操作 1.准备jar包 2.编辑Product模型 package com.day02.ssm.spring.model; public class Pro ...