PHP Conference Japan 2024

call_user_func_array

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

call_user_func_array使用參數陣列呼叫回呼函式

說明

call_user_func_array(callable $callback, array $args): mixed

args 中的參數呼叫第一個參數指定的 callback

參數

callback

要被呼叫的 可呼叫 物件。

args

要傳遞給 callback 的參數,以陣列形式提供。

如果 args 的所有鍵值都是數字,則鍵值會被忽略,每個元素將會依序作為位置參數傳遞給 callback

如果 args 的任何鍵值是字串,則這些元素將會作為命名參數傳遞給 callback,名稱由鍵值指定。

如果 args 中的數字鍵值出現在字串鍵值之後,或者字串鍵值與 callback 的任何參數名稱不符,則會發生致命錯誤。

返回值

返回 callback 的返回值,如果發生錯誤則返回 false

更新日誌

版本 說明
8.0.0 args 的鍵值現在會被解讀為參數名稱,而不是被默默忽略。

範例

範例 #1 call_user_func_array() 範例

<?php
function foobar($arg, $arg2) {
echo
__FUNCTION__, " 收到 $arg$arg2\n";
}
class
foo {
function
bar($arg, $arg2) {
echo
__METHOD__, " 收到 $arg$arg2\n";
}
}


// 使用 2 個參數呼叫 foobar() 函式
call_user_func_array("foobar", array("one", "two"));

// 使用 2 個參數呼叫 $foo->bar() 方法
$foo = new foo;
call_user_func_array(array($foo, "bar"), array("three", "four"));
?>

上述範例將輸出類似以下的內容

foobar got one and two
foo::bar got three and four

範例 #2 使用命名空間的 call_user_func_array()

<?php

namespace Foobar;

class
Foo {
static public function
test($name) {
print
"Hello {$name}!\n";
}
}

call_user_func_array(__NAMESPACE__ .'\Foo::test', array('Hannes'));

call_user_func_array(array(__NAMESPACE__ .'\Foo', 'test'), array('Philip'));

?>

上述範例將輸出類似以下的內容

Hello Hannes!
Hello Philip!

範例 #3 使用 Lambda 函式

<?php

$func
= function($arg1, $arg2) {
return
$arg1 * $arg2;
};

var_dump(call_user_func_array($func, array(2, 4)));

?>

上述範例會輸出

int(8)

範例 #4 使用傳參考方式傳遞值

<?php

function mega(&$a){
$a = 55;
echo
"函式 mega \$a=$a\n";
}
$bar = 77;
call_user_func_array('mega',array(&$bar));
echo
"全域變數 \$bar=$bar\n";

?>

上述範例會輸出

function mega $a=55
global $bar=55

範例 #5 使用具名引數的 call_user_func_array()

<?php
function foobar($first, $second) {
echo
__FUNCTION__, " got $first and $second\n";
}

// 使用非位置順序的命名參數呼叫 foobar() 函式
call_user_func_array("foobar", array("second" => "two", "first" => "one"));

// 使用一個命名參數呼叫 foobar() 函式
call_user_func_array("foobar", array("foo", "second" => "bar"));

// 致命錯誤:命名參數後不能使用位置參數
call_user_func_array("foobar", array("first" => "one", "bar"));

?>

上述範例將輸出類似以下的內容

foobar got one and two
foobar got foo and bar

Fatal error: Uncaught Error: Cannot use positional argument after named argument

注意事項

備註:

如果先前 callback 擲出未捕獲的例外,則使用 call_user_func()call_user_func_array() 等函式註冊的 callback 將不會被呼叫。

參見

新增備註

使用者貢獻的備註 1 則備註

40
sebastian dot rapetti at tim dot it
3 年前
在 PHP 8 中,如果將帶有鍵值的陣列傳遞給 $args 參數,call_user_func_array 會使用命名參數呼叫 callback 函式;如果使用的陣列只有值,則會以位置方式傳遞參數。

<?php

函式 test(字串 $param1, 字串 $param2): void
{
echo
$param1.' '.$param2;
}

$args = ['hello', 'world'];
//hello world
call_user_func_array('test', $args);

$args = ['param2' => 'world', 'param1' => 'hello'];
//hello world
call_user_func_array('test', $args);

$args = ['unknown_param' => 'hello', 'param2' => 'world'];
//致命錯誤:未捕捉到的錯誤:未知的具名參數 $unknown_param
call_user_func_array('test', $args);
?>
To Top