PHP 中 call_user_func call_user_func_array

作者:难得一见 更新时间:2023-05-25 21:55
1.直接调用函数
function set_max($a,$b)  
{
   if($a>$b)
     echo $a;
   else
    echo $b;
}
call_user_func('set_max', "111","222");//结果为222
2.调用类中的函数
class A
{
    function b($c)
    {
        echo $c ;
    }
}
$num = 200 ;
call_user_func(array(new A,'b'),$num);//结果为200 
//在php5.3 之前是可以如下调用非静态函数的,系统会把b当做非静态函数处理
// call_user_func(array("A", "b"),$num);
//在 php5.3 之后如果调用类的实例方法,必须通过类的实例调用,如下
$a = new A;
call_user_func(array($a, "b"), $num);
3.调用静态方法
call_user_func(array("A", "c"), "c");
或者:
call_user_func("A::c", "c");
4.call_user_func_array 与call_user_func基本相同,更直观一些,参数使用数组来代替
 
function set_max($a,$b)
{
   if($a>$b)
      echo $a;
   else
      echo $b;
}
call_user_func_array('set_max',array(111,222));
//结果222
call_user_func_array(array($a, "b"), array("bb"));
call_user_func_array("A::c", array("cc"));
call_user_func_array(array("A", "c"), array("cc"));

call_user_func函数和call_user_func_array函数都支持引用,这让他们和普通的函数调用更趋于功能一致

function swap(&$a){
    $a++;
}
$x = 5;
//
//call_user_func('swap',&$x);  //出错 调用时通过引用传递在 PHP 5.4 中已被移除
//call_user_func('swap',$x);  //出错 ($a) must be passed by reference, value given
swap($x); //正常
echo $x;  //6
call_user_func_array("swap", array(&$x)); echo $x; //7

//所以特殊需求使用以下方法 很怪异...能正常使用
//因为前者的语法,已被弃用很长时间。
// 后者只是将参数传递给一个函数array(&$x)(恰好是 call_user_func_array)(间接调用 $$z=&$x;swap($z);echo $z;,语法上通过)所以它没有任何问题。
// 您可以使用后一种语法来进行调用时引用的雷达形式(间接调用 $$z=&$x;swap($z);echo $z;,语法上通过),或者您可以将其用于合法目的 - 例如为 by-ref 变量参数函数制作包装器(PDO 中的参数化绑定可能是一个例子)。
// 差异是前者总是不合法且不需要,后者可能是合法的或不合法的,具体取决于使用情况。

// 相关解释在这里:https://stackoverflow.com/questions/4665782/php-warning-call-time-pass-by-reference-has-been-deprecated