PHP 中 call_user_func 函式 和 call_user_func_array 函式
阿新 • • 發佈:2018-11-13
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);