call_user_func函數(shù)類似于一種特別的調(diào)用函數(shù)的方法,使用方法如下: 復(fù)制代碼 代碼如下: function a($b,$c) { echo $b; echo $c; } call_user_func('a', "111","222"); call_user_func('a', "333","444"); //顯示 111 222 333 444 ?> 調(diào)用類內(nèi)部的方法比較奇怪,居然用的是array,不知道開發(fā)者是如何考慮的,當(dāng)然省去了new,也是滿有新意的: 復(fù)制代碼 代碼如下: class a { function b($c) { echo $c; } } call_user_func(array("a", "b"),"111"); //顯示 111 ?> call_user_func_array函數(shù)和call_user_func很相似,只不過(guò)是換了一種方式傳遞了參數(shù),讓參數(shù)的結(jié)構(gòu)更清晰: 復(fù)制代碼 代碼如下: function a($b, $c) { echo $b; echo $c; } call_user_func_array('a', array("111", "222")); //顯示 111 222 ?> call_user_func_array函數(shù)也可以調(diào)用類內(nèi)部的方法的 復(fù)制代碼 代碼如下: 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函數(shù)和call_user_func_array函數(shù)都支持引用,這讓他們和普通的函數(shù)調(diào)用更趨于功能一致: 復(fù)制代碼 代碼如下: 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的簡(jiǎn)易用法 今天在群里面,有個(gè)叫l(wèi)ewis的在問(wèn)call_user_func_array的用法,因?yàn)橹耙恢睕](méi)有用過(guò),也不能說(shuō)什么,于是看一下手冊(cè),發(fā)現(xiàn)是這么寫的: 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. 然后還有一個(gè)例子: 復(fù)制代碼 代碼如下: <?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 復(fù)制代碼 代碼如下: <?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 復(fù)制代碼 代碼如下: <?php $func = function($arg1, $arg2) { return $arg1 * $arg2; }; var_dump(call_user_func_array($func, array(2, 4))); /* As of PHP 5.3.0 */ ?> 以上例程會(huì)輸出: int(8) 相信看了例子之后應(yīng)該有點(diǎn)明白了吧? 我自己是這么理解這個(gè)函數(shù)的,如果說(shuō)的不對(duì),還望各位高手不要恥笑: 該函數(shù)真正的用法有點(diǎn)類似于函數(shù)重載,因?yàn)樗牡谝粋€(gè)參數(shù)是字符型的,也就是函數(shù)的名稱,第二個(gè)參數(shù)是數(shù)組,我們可以當(dāng)成該函數(shù)的各個(gè)參數(shù),而事實(shí)上也就是這么用的,如果你看過(guò)我的前一篇文章:PHP的偽重載 ,或許你能夠理解,正是因?yàn)檫@個(gè)函數(shù)的存在,我發(fā)現(xiàn)函數(shù)重載也可以這樣運(yùn)用: 復(fù)制代碼 代碼如下: /** * 例子寫完后,本來(lái)認(rèn)為完事了,結(jié)果遇到有人問(wèn)call_user_func_array(),看了一下手冊(cè) * 原來(lái),我上面的那個(gè)test函數(shù)還可以精簡(jiǎn)成如下的例子, */ function otest1 ($a) { echo( '一個(gè)參數(shù)' ); } function otest2 ( $a, $b) { echo( '二個(gè)參數(shù)' ); } function otest3 ( $a ,$b,$c) { echo( '三個(gè)啦' ); } function otest () { $args = func_get_args(); $num = func_num_args(); call_user_func_array( 'otest'.$num, $args ); } otest(1,2); 看到不?而我最初的寫法,在PHP的偽重載一文中有所提及,僅作參考。。。。 |
|
來(lái)自: yliu277 > 《thinkphp》