一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - PHP教程 - php自定義函數call_user_func和call_user_func_array詳解

php自定義函數call_user_func和call_user_func_array詳解

2019-12-06 13:15PHP教程網 PHP教程

看UCenter的時候有一個函數call_user_func,百思不得其解,因為我以為是自己定義的函數,結果到處都找不到,后來百度了一下才知道call_user_func是內置函數

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

復制代碼代碼如下:


function a($b,$c) 

echo $b; 
echo $c; 

call_user_func('a', "111","222"); 
call_user_func('a', "333","444"); 
//顯示 111 222 333 444 
?> 


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

復制代碼代碼如下:


class a { 
function b($c) 

echo $c; 


call_user_func(array("a", "b"),"111"); 
//顯示 111 
?> 


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

復制代碼代碼如下:


function a($b, $c) 

echo $b; 
echo $c; 

call_user_func_array('a', array("111", "222")); 
//顯示 111 222 
?> 


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

復制代碼代碼如下:


Class ClassA 

function bc($b, $c) { 
$bc = $b + $c; 
echo $bc; 


call_user_func_array(array('ClassA','bc'), array("111", "222")); 
//顯示 333 
?> 


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

復制代碼代碼如下:


function a(&$b) 

$b++; 

$c = 0; 
call_user_func('a', &$c); 
echo $c;//顯示 1 
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 parametersDescription 
mixed 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 foobar($arg, $arg2) { 
echo __FUNCTION__, " got $arg and $arg2\n"; 

class foo { 
function bar($arg, $arg2) { 
echo __METHOD__, " got $arg and $arg2\n"; 


// Call the foobar() function with 2 arguments 
call_user_func_array("foobar", array("one", "two")); 
// Call the $foo->bar() method with 2 arguments 
$foo = new foo; 
call_user_func_array(array($foo, "bar"), array("three", "four")); 
?> 


以上例程的輸出類似于: 
foobar got one and two 
foo::bar got three and four 
Example #2 call_user_func_array() using namespace name 

復制代碼代碼如下:


<?php 
namespace Foobar; 
class Foo { 
static public function test($name) { 
print "Hello {$name}!\n"; 


// As of PHP 5.3.0 
call_user_func_array(__NAMESPACE__ .'\Foo::test', array('Hannes')); 
// As of PHP 5.3.0 
call_user_func_array(array(__NAMESPACE__ .'\Foo', 'test'), array('Philip')); 
?> 


以上例程的輸出類似于: 
Hello Hannes! 
Hello Philip! 
Example #3 Using lambda function 

復制代碼代碼如下:


<?php 
$func = function($arg1, $arg2) { 
return $arg1 * $arg2; 
}; 
var_dump(call_user_func_array($func, array(2, 4))); /* As of PHP 5.3.0 */ 
?> 


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

復制代碼代碼如下:


/** 
* 例子寫完后,本來認為完事了,結果遇到有人問call_user_func_array(),看了一下手冊 
* 原來,我上面的那個test函數還可以精簡成如下的例子, 
*/ 
function otest1 ($a) 

echo( '一個參數' ); 

function otest2 ( $a, $b) 

echo( '二個參數' ); 

function otest3 ( $a ,$b,$c) 

echo( '三個啦' ); 

function otest () 

$args = func_get_args(); 
$num = func_num_args(); 
call_user_func_array( 'otest'.$num, $args ); 

otest(1,2); 


看到不?而我最初的寫法,在PHP的偽重載一文中有所提及,僅作參考。。。。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 久久久久999| 9420高清完整版在线观看国语 | 亚洲黄色天堂 | 国产欧美日韩图片一区二区 | 天天碰夜夜操 | 91看片淫黄大片欧美看国产片 | 国产亚洲玖玖玖在线观看 | 日本xxxx69hd| 99色亚洲 | 国产精彩对白综合视频 | 99精品国产在现线免费 | 四缺一的小说 | 成人夜视频寂寞在线观看 | 亚洲国产精品久久精品怡红院 | 欧美一卡2卡3卡无卡 | 日韩毛片大全免费高清 | 91香蕉视频在线观看 | 久久久久久久久性潮 | 扒开腿开嫩苞 | 欧美另类xxx精品人妖 | 日本欧美大码a在线视频播放 | tube69中国露脸 | 国产精品怡红院在线观看 | 国产一区二区三区欧美精品 | 日本无遮挡拍拍拍凤凰 | 国产二区三区 | 4p高h三男一女 | 91久久夜色精品国产九色 | 91免费精品国自产拍在线不卡 | 亚洲欧洲日产v特级毛片 | 天天色天天舔 | 婚前试爱全集免费观看 | 久久精品亚洲精品国产欧美 | 3x3x3x短视频在线看 | 国产亚洲自愉自愉 | 日本高清视频在线免费观看 | 91视频国产精品 | 国产视频二区 | 成年性生交大片免费看 | 亚洲日本视频在线观看 | 精品手机在线1卡二卡3卡四卡 |