PHP call_user_func_array ,call_user_func_array

PHP函數call_user_func和call_user_func_array詳解

ddd

call_user_func函數類似於一種特別的調用函數的方法,使用方法如下: 

  1. function a($b,$c)   
  2. {  
  3. echo $b;  
  4. echo $c;  
  5. }  
  6. call_user_func('a'"111","222");  
  7. call_user_func('a'"333","444");  


//顯示 111 222 333 444
?>

調用類內部的方法比較奇怪,居然用的是array,不知道開發者是如何考慮的,當然省去了new,也是滿有新意的:

  1. class a {  
  2. function b($c)   
  3. {  
  4. echo $c;  
  5. }  
  6. }  
  7. call_user_func(array("a""b"),"111");  


//顯示 111
?>

call_user_func_array函數和call_user_func很相似,只不過是換了一種方式傳遞了參數,讓參數的結構更清晰:

  1. function a($b$c)   
  2. {  
  3. echo $b;  
  4. echo $c;  
  5. }  
  6. call_user_func_array('a'array("111""222"));  


//顯示 111 222
?>

call_user_func_array函數也可以調用類內部的方法的

  1. Class ClassA  
  2. {  
  3. function bc($b$c) {  
  4.      $bc = $b + $c;  
  5. echo $bc;  
  6. }  
  7. }  
  8. call_user_func_array(array('ClassA','bc'), array("111""222"));  


//顯示 333
?>

call_user_func函數和call_user_func_array函數都支持引用,這讓他們和普通的函數調用更趨於功能一致:

  1. function a(&$b)  
  2. {  
  3. $b++;  
  4. }  
  5. $c = 0;  
  6. call_user_func('a', &$c);  
  7. echo $c;//顯示 1  
  8. call_user_func_array('a'array(&$c));  


echo $c;//顯示 2

php之call_user_func_array的簡易用法

今天在羣裏面,有個叫lewis的在問call_user_func_array的用法,因爲之前一直沒有用過,也不能說什麼,於是看一下手冊,發現是這麼寫的:

call_user_func_array

(php 4 >= 4.0.4, PHP 5)

call_user_func_array -- Call a user function given with an array of parametersDescriptionmixed call_user_func_array ( callback function, array param_arr )

Call a user defined function given by function, with the parameters in param_arr. 
然後還有一個例子:


<?php
function debug($var,$val) 
{
    echo"***DEBUGGING\nVARIABLE: $var\nVALUE:";
    if (is_array($val) ||is_object($val) ||is_resource($val)) {
        print_r($val);
     } else {
        echo"\n$val\n";
     }
    echo"***\n";
}

$c=mysql_connect();
$host=$_SERVER["SERVER_NAME"];

call_user_func_array('debug',array("host",$host));
call_user_func_array('debug',array("c",$c));
call_user_func_array('debug',array("_POST",$_POST));

?>

func_num_args() 這個函數返回的是當前函數的參數數量 返回的是數字
func_get_arg()函數返回的是指定位置的參數的值
func_get_args()這個函數返回的是包含當前函數所有參數的一個數組

相信看了例子之後應該有點明白了吧?
我自己是這麼理解這個函數的,如果說的不對,還望各位高手不要恥笑:
     該函數真正的用法有點類似於函數重載,因爲他的第一個參數是字符型的,也就是函數的名稱,第二個參數是數組,我們可以當成該函數的各個參數,而事實上也就是這麼用的,如果你看過我的前一篇文章:PHP的僞重載 ,或許你能夠理解,正是因爲這個函數的存在,我發現函數重載也可以這樣運用:


  /**
 2     * 例子寫完後,本來認爲完事了,結果遇到有人問call_user_func_array(),看了一下手冊
 3     * 原來,我上面的那個test函數還可以精簡成如下的例子,
 4     */
 5    function otest1 ($a)
 6    {
 7        echo'一個參數' );
 8    }
 9
10    function otest2 ( $a, $b)
11    {
12        echo'二個參數' );
13    }
14
15    function otest3 ( $a ,$b,$c)
16    {
17        echo'三個啦' );
18    }
19
20    function otest ()
21    {
22        $args = func_get_args();
23        $num = func_num_args();
24        call_user_func_array'otest'.$num, $args  );
25    }
26

27    otest(1,2);



下面是我自己寫的一個函數重載例子


  1. <?php  
  2. header('Content-Type:text/html;charset=utf-8');  
  3.   
  4. abstract class a {  
  5.     function __call($name,$args) {  
  6.         $method = $name.'_'.count($args);  
  7.         if(!method_exists($this,$method)) {  
  8.             throw new Exception("Call to undefined method ".get_class($this)."::$method");  
  9.         } else {  
  10.             call_user_func_array(array($this,$method),$args);  
  11.         }  
  12.     }  
  13. }  
  14. class b extends a {  
  15.     function a_0() {  
  16.         echo "haahahaha";  
  17.     }  
  18.     function a_1($arg) {  
  19.         echo "haahahaha".$arg;  
  20.     }  
  21. }  
  22. $b = new b();  
  23. try {  
  24. $b->a();  
  25. $b->a('fffff');  
  26. }catch(Exception $e) {  
  27.     echo $e->getMessage();  
  28. }
  29. ?> 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章