激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

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

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的偽重載一文中有所提及,僅作參考。。。。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 免费黄色在线观看网站 | 精品成人一区 | 国产一区二区免费在线观看视频 | 久久久久久久久久网站 | 欧美一级片一区 | 欧美精品a∨在线观看不卡 午夜精品影院 | 92看片淫黄大片欧美看国产片 | 国产成人精品一区二区仙踪林 | 久草在线最新免费 | 欧洲成人一区二区 | 成人午夜淫片a | 国产美女自拍av | 又黄又爽又色无遮挡免费 | 久久国产精品二国产精品中国洋人 | 国产精品久久久久久婷婷天堂 | 777zyz色资源站在线观看 | 国产精品自拍片 | 国产精品一区二区x88av | 精品一区二区在线视频 | 精品亚洲视频在线观看 | 99亚洲伊人久久精品影院红桃 | 国产伦精品一区二区三区在线 | 中文字幕22页 | 国产亚洲精品久久久久5区 99精品视频在线 | 毛片视| 色综合久久久久久久久久久 | 午夜精品福利影院 | 国产91中文字幕 | 久久久久二区 | 久久噜噜噜精品国产亚洲综合 | 国产精品久久久久久238 | 亚洲欧美不卡视频 | 国产精品成年片在线观看, 日韩毛片网 | 精品国产一区二区三区四区阿崩 | 欧美成人高清在线 | 国产乱淫a∨片免费观看 | 双性精h调教灌尿打屁股的文案 | 91美女福利视频 | 99精品视频久久精品视频 | 国产精品免费麻豆入口 | 在线视频 中文字幕 |