• 【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
    ?>
    
  • 相关阅读:
    The prefix "mvc" for element "mvc:annotation-driven" is not bound 的解决方法
    Intellij Idea14 jstl标签的引入
    17个短视频渠道分成收益全解析
    chrome浏览器插件推荐——Vimium 篇
    从Java代码到字节码(1)
    Java跳出循环-break和continue语句
    Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
    Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.5:test
    XML文件解析
    jpa基于按annotation的hibernate主键生成策略
  • 原文地址:https://www.cnblogs.com/xuelisheng/p/9416905.html
Copyright © 2020-2023  润新知