PHP根據函數名稱動態調用該函數

對於PHP程序員而言,函數是再熟悉不過的事物了,畢竟咱們成天都在和PHP內置函數以及咱們自定義的函數打交道。通常狀況下,咱們想要調用一個函數直接在PHP代碼中寫上該函數的名稱,後面加上一對小括號便可。譬如,咱們要調用本身編寫的用於計算兩個數之和的add()函數,調用示例代碼以下:php

<?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()與此相似,不過除了做爲函數名稱的第一個參數外,後面調用函數所需的參數是以數組的形式總體傳遞進去的)。函數

這裏,咱們能夠參考一個具體的示例:code

<?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
?>
相關文章
相關標籤/搜索