對於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 ?>