呼叫用户取消阵列

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

呼叫用户取消阵列使用参数数组调用回调

描述

呼叫用户取消阵列(可调用的 $回调,阵列 $个参数):混合的

调用回调由第一个参数给定中的参数参数.

参数

回调

这个可调用的将被调用。

参数

要作为数组传递给回调的参数。

如果参数都是数字,键被忽略,每个元素都将传递给回调作为位置参数,在订单。

如果的任何键参数是字符串,这些元素将传递给回调作为命名参数,使用键给定的名称。

在中使用数字键是一个致命错误参数出现在字符串键之后,或具有不匹配的任何参数的名称回调.

返回值

返回回调的返回值,或出现错误。

变更日志

版本 描述
8.0.0 参数键现在将被解释为参数名,而不是被默认忽略。

示例

示例#1call_user_func_array()例子

<?php程序
功能foobar公司($参数,$arg2) {
回声
__功能__,“得到$参数$arg2\n“;
}
foo公司{
功能
酒吧($参数,$arg2) {
回声
__方法__,“得到$参数$arg2\n“;
}
}


//使用2个参数调用foobar()函数
呼叫用户取消阵列(“foobar”,数组(“一个”,“两个”));

//用2个参数调用$foo->bar()方法
$foo美元=新foo公司;
调用用户函数数组(数组($foo美元,“酒吧”),数组(“三个”,“四个”));
?>

以上示例将输出类似于:

foobar得了1分和2分foo::bar得了三分和四分

示例#2call_user_func_array()使用命名空间名称

<?php程序

命名空间Foobar公司;

{
静态公共功能
测试($名称) {
打印
“你好{$名称}\n“;
}
}

呼叫用户取消阵列(__NAMESPACE公司__.“\Foo::测试”,数组(“汉纳斯”));

呼叫用户取消阵列(数组(__NAMESPACE公司__.“\Foo”,“测试”),数组(“菲利普”));

?>

上述示例将输出类似于:

你好,汉斯!你好,菲利普!

示例#3使用lambda函数

<?php程序

$函数
=功能($arg1,$arg2) {
返回
$arg1*$arg2;
};

变量转储(呼叫用户取消阵列($func(函数),数组(2,4)));

?>

上述示例将输出:

整数(8)

示例#4通过引用传递值

<?php程序

功能百万(&美元){
美元=55;
回声
“函数mega\$a=美元\n“;
}
$巴=77;
呼叫用户取消阵列(“百万”,数组(&$巴));
回声
“全局\$bar=$巴\n“;

?>

上述示例将输出:

功能mega$a=55全局$bar=55

示例#5call_user_func_array()使用命名参数

<?php程序
功能foobar公司($优先,$秒) {
回声
__功能__,“得到$优先$秒\n“;
}

//使用非位置顺序的命名参数调用foobar()函数
呼叫用户取消阵列(“foobar”,数组(“第二个”=>“两个”,“第一个”=>“一个”));

//使用一个命名参数调用foobar()函数
呼叫用户取消阵列(“foobar”,数组(“foo”,“第二个”=>“酒吧”));

//致命错误:无法在命名参数后使用位置参数
呼叫用户取消阵列(“foobar”,数组(“第一个”=>“一个”,“酒吧”));

?>

以上示例将输出类似于:

foobar得了1分和2分foobar得到了foo和bar致命错误:未捕获错误:无法在命名参数后使用位置参数

笔记

注释:

已注册回调具有以下功能调用user_func()call_user_func_array()不会的如果在前一个回调中抛出未捕获的异常,则调用。

另请参见

添加注释

用户贡献的笔记4条注释

torntech dot com管理员
8年前
从PHP 5.6开始,您可以使用参数解包作为call_user_func_array的替代方法,通常速度快3到4倍。

<?php程序
功能foo公司(美元,十亿美元) {
返回
美元+十亿美元;
}

$函数=“foo”;
$值=数组(1,2);
呼叫用户取消阵列($函数,$值);
//返回3

$函数(...$值);
//返回3
?>

来自的基准https://gist.github.com/nikic/6390366
cufa以0个参数获得0.43453288078308
具有0个参数的交换机需要0.24134302139282
用0个参数解包需要0.12418699264526
拥有5个参数的cufa获得0.73408579826355
带有5个参数的交换机需要0.49595499038696
用5个args打开包装花费0.18640494346619
拥有100个args的cufa获得5.0327250957489分
带有100个参数的交换机需要5.291127204895
用100个参数解包需要1.2362589836121
塞巴斯蒂安·多特·雷佩蒂在蒂姆·多特
3年前
使用PHP 8,call_user_func_array使用命名参数调用回调函数如果将带有键的数组传递给$args参数,如果使用的数组只有值,则按位置传递参数。

<?php程序

功能测试(字符串$param1,字符串$param2):空隙
{
回声
$参数1.' '.$参数2;
}

$个参数= [“你好”,“世界”];
//你好,世界
呼叫用户取消阵列(“测试”,$个参数);

$个参数= [“参数2”=>“世界”,“参数1”=>“你好”];
//你好,世界
呼叫用户取消阵列(“测试”,$个参数);

$个参数= ['未知参数'=>“你好”,“参数2”=>“世界”];
//致命错误:未捕获错误:未知的命名参数$Unknown_param
呼叫用户取消阵列(“测试”,$个参数);
?>
阿兰吉德里克在gmail网站
7个月前
阅读本页中的注释非常有趣,尤其是其中提到的参数解包速度明显快于管理员在torntech dot com直接调用“call_user_func_array()”的区别。

这对于PHP 5来说是正确的,但与PHP 7.0+一样,这两种操作机制在运行时没有显著差异。这两个操作所花费的时间几乎相同,如果不是相同的话,那么这已经告诉我PHP运行时环境已经发生了很大的变化(对于PHP7重写)。

我用了torntechdotcom管理员的例子来验证这个假设。
詹姆斯在gogo dot co dot nz
19年前
请注意,call_user_func_array总是按值返回,如下所示。。。

<?php程序
函数&foo公司(&美元)
{
返回
美元;
}

十亿美元=2;
$c美元=&呼叫用户取消阵列(“foo”,数组(&十亿美元));
$c美元++;
回声
十亿美元.' '.$c美元;
?>

输出“23”,而不是预期的“33”。

这里有一个函数可以用来代替call_user_func_array,它返回对函数调用结果的引用。

<?php程序
功能&参考调用用户调用数组($可调用,$个参数)
{
如果(
是刻度(_S)($可调用))
{
//$callable是函数的名称
$呼叫=$可调用;
}
其他的
{
如果(
is_object(_O)($可调用[0]))
{
//$callable是一个对象和一个方法名
$呼叫=“\$可调用[0]->{$可调用[1]}";
}
其他的
{
//$callable是一个类名和一个静态方法
$呼叫="{$可调用[0]}::{$可调用[1]}";
}
}

//注意,因为$args中的键可能是字符串
//我们做这件事的方式稍微有些迂回。
$argumentString=阵列();
$参数键=数组键($个参数);
foreach公司(
$参数键作为$argK(美元))
{
$argumentString[] =“”\$args“[$参数键[$argK(美元)]]";
}
$argumentString=内爆($argumentString,',');
//还要注意eval不返回引用,所以我们
//以这种方式解决它。。。
评估(“\$result=&{$呼叫}({$argumentString});");
返回
$结果;
}
?>
到顶部