PHP 函數之 call_user_func & call_user_func_array

來源:互聯網
上載者:User
call_user_func_array (callable $callback, array $param_arr)

參數1: 調用一個回呼函數, 

參數2: 數組參數是回呼函數的參數.


call_user_func(callable $callback, $mixed $parameter, $mixed $...)

參數1:調用的回呼函數

參數2-n:回呼函數的參數.


比較這兩者的不同哦. 前者的第二個參數必須是 數組.


情況一:調用普通的函數.

<?phpfunction barber($type){    echo "You wanted a $type haircut, no problem\n";}call_user_func('barber', "mushroom");call_user_func('barber', "shave");?> 

這裡,第一個參數直接指定函數的名稱.

<?phpfunction barber($type){    echo "You wanted a $type haircut, no problem\n";}call_user_func_array('barber', array("mushroom"));call_user_func_array('barber', array("shave"));?> 

還是比較一下這兩者之間的不同.

看出來的請繼續.


情況二: 調用類中的靜態函數.

下面是call_user_func_arr

namespace Foo;class F {public static function showName ($name) {return strtoupper($name);}}echo call_user_func_array(__NAMESPACE__.'\F::showName', array('vein'));echo call_user_func_array(array(__NAMESPACE__.'\F', 'showName'), array('vein'));$f = new F();echo call_user_func_array(array($f, 'showName'), array('vein'));

下面是call_user_func 

namespace Foo;class F {public static function showName ($name) {return strtoupper($name);}}echo call_user_func(__NAMESPACE__ . '\F::showName','vein');echo call_user_func(array(__NAMESPACE__ . '\F','showName'),'vein');$f = new F();echo call_user_func(array($f, 'showName'),'vein');

情況三:動態方法引動過程

call_user_func

namespace Foo;class F {public function showAge ($age) {return $age + 100;}}call_user_func(__NAMESPACE__ . '\F::showAge',23);

這裡要注意一點,如果這樣調用的話,系統會報錯,提示

call_user_func() expects parameter 1 to be a valid callback, non-static method Foo\F::showAge() should not be called s
tatically

解釋一下: 這個函數的第一個參數必須是 有效回呼函數, 非靜態方法showAge() 是不允許調用的.

需要的解決方案是:

namespace Foo;class F {public static function showName ($name) {return strtoupper($name);}public function showAge ($age) {return $age + 100;}}$f = new F(); echo call_user_func(array($f, 'showAge'),23);


對於這樣的動態函數的調用,必須提前進行對象執行個體化,

然後將執行個體化之後的對象傳入函數作為第一個參數.


call_user_func_array :

namespace Foo;class F {public static function showName ($name) {return strtoupper($name);}public function showAge ($age) {return $age + 100;}}$f = new F(); echo call_user_func_array(array($f, 'showAge'),array(23));

這樣也是可行的.


總結一下: call_user_func_array 和 call_user_func 兩個函數基本上是類似的,只是在調用上傳遞參數時存在一些差異.

記住一點,call_user_func_array 傳遞的第二個參數必須是數組,

call_user_func 傳遞的第二個參數可能是數組.如果是多個參數的話,還是需要以列表的形式列出.



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.