解釋函數: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 ?>