【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
?>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM