1. 程式人生 > >PHP 中 call_user_func 函式 和 call_user_func_array 函式

PHP 中 call_user_func 函式 和 call_user_func_array 函式

PHP 中 call_user_func() 函式 和 call_user_func_array()函式都是回撥函式

區別:

  • call_user_func()
    可以有多個引數,第一個引數為被呼叫的回撥函式,除了第一個引數外,其他引數均為被呼叫函式的引數
  • call_user_func_array()
    只有兩個引數,第一個引數為被呼叫的回撥函式,第二個引數是要被傳入回撥函式的陣列,這個陣列必須是索引陣列。

事例一:

  • call_user_func() 函式 和 call_user_func_array()區別
<?php
function callBack() { $args = func_get_args(); $num = func_num_args(); echo $num."個引數:"; echo "<pre>"; print_r($args); echo "</pre>"; } $arr = array( 'name' => 'liuli', 'sex' => 'boy' ); ------------------------------------------
------------------------------------ call_user_func('callBack', $arr); #輸出結果 1個引數: Array ( [0] => Array ( [name] => liuli [sex] => boy ) ) ------------------------------------------------------------------------------ call_user_func_array('callBack'
, $arr); #輸出結果 2個引數: Array ( [0] => liuli [1] => boy )

事例二:

  • 匿名函式傳參
<?php

call_user_func(function($args){
    
    echo $args;

}, 1);
#輸出結果
1

案例三:

  • 回撥函式是匿名函式,並且匿名函式不設引數,通過其他方式獲取引數的情況
<?php
$arg1 = 'first';
$arg2 = 'two';
$return = call_user_func(function(){
    $arg = func_get_arg(0); //func_get_arg函式作用:獲取函式的第幾個引數,必須要有引數,引數必須為函式引數的偏移量,0代表第一個引數
    $args = func_get_args();//func_get_args的作用:獲取函式所有的引數
    if(func_num_args() == 1){//func_num_args函式的作用:獲取函式引數的個數,注意,假如函式沒有傳參,該函式返回0
        return $args[0];
    }else{
        //用|把函式的引數組織成字串
        return implode('|',$args);
    }
},$arg1,$arg2);
var_dump($return);

#輸出結果
string(9) "first|two"

事例四:

  • 呼叫沒有名稱空間類的方法
class Func{
    //靜態方法
    static public function _func(){
        $str =  'THE CLASS NAME IS '.__CLASS__.' AND CLASS STATIC METHOD IS '.__METHOD__;
        if(func_num_args()){
            //獲取函式引數,獲取引數也可以通過給方法設定形參來獲取,這裡只是沒給方法設定形參獲取引數的情況
            $arg = func_get_arg(0);
            return $str.' and argument is '.$arg;
        }else{
            return $str;
        }
    }
    //普通方法
    public function __func($num){
        return $num ? $num+1:$num;
    }
}
//傳遞類的靜態方法,有兩種方式
//(1)種,傳遞····類名::方法名····
var_dump(call_user_func("Func::_func",'hell world'));//這裡傳遞引數
//(2)種,傳遞類名和方法名的陣列
var_dump(call_user_func(array('Func','_func')));//這裡沒有傳引數
$num = 4;
$o = new Func;
//傳遞類普通方法必須用···陣列···傳遞···該類的物件··和···方法名···
$return = call_user_func(array($o,'__func'),$num);
var_dump($return);
#輸出結果
string(88) "THE CLASS NAME IS Func AND CLASS STATIC METHOD IS Func::_func and argument is hell world" string(61) "THE CLASS NAME IS Func AND CLASS STATIC METHOD IS Func::_func" int(5)

事例五:

  • 呼叫有名稱空間的類方法的情況
<?php
//定義類的名稱空間
namespace Home;
class Space{
    //靜態方法
    static public function _call($num){
        return $num +=10;
    }
    //普通方法
    public function _func(){
        return func_get_args();//返回函式的引數
    }
}
//針對靜態方法,有兩種呼叫方式
//1.可以用array(__NAMESPACE__.'\類名','方法名')傳遞類方法,也就是:array('名稱空間\類名','方法名')
$return = call_user_func(array(__NAMESPACE__.'\Space','_call'),10);
//2.可以用····    __NAMESPACE__.'\類名::方法名'    ···傳遞類方法,也就是:'名稱空間\類名::方法名'
$return1 = call_user_func('Home\Space::_call',100);
var_dump($return);
var_dump($return1);
//針對普通方法,不用傳入名稱空間即可呼叫,如下
$o = new Space;
$return = call_user_func(array($o,'_func'),1,2,3,4,5);
var_dump($return);

#輸出結果
int(20) int(110) array(5) { [0]=> int(1) [1]=> int(2) [2]=> int(3) [3]=> int(4) [4]=> int(5) }

事例六:

  • 呼叫php內建函式
$return = call_user_func('rtrim','sso;osoo;',';');
$return2 = call_user_func('explode',';','sso;osoo;');

#輸出結果
string(8) "sso;osoo" array(3) { [0]=> string(3) "sso" [1]=> string(4) "osoo" [2]=> string(0) "" }

總結

  • call_user_func_array同理
  • 呼叫靜態方法第一引數的兩種方式:
    call_user_func("Func::_func", 'hello world')
    call_user_func(array('Func','_func'))
  • 呼叫普通方法的方式:
    call_user_func(array(new之後的物件, 方法名), 引數);
    例如:
$num = 4;
$o = new Func;
$return = call_user_func(array($o,'__func'),$num);