在PHP中将数组作为参数传递,而不是数组

mrphzbgm  于 2023-05-05  发布在  PHP
关注(0)|答案(4)|浏览(105)

我似乎记得在PHP中有一种方法可以将数组作为函数的参数列表传递,将数组解引用为标准的func($arg1, $arg2)方式。但现在我不知道该怎么做了。我记得通过引用传递的方式,如何“glob”传入参数...而不是如何将数组从列表中删除到参数列表中。
它可能像func(&$myArgs)一样简单,但我很肯定不是这样的。但是,遗憾的是,php.net手册到目前为止还没有透露任何信息。并不是说我在过去的一年里不得不使用这个特殊的功能。

cbeh67ev

cbeh67ev1#

注意:此解决方案已过时,请参考simonhamp的回答以获取更新信息。

http://www.php.net/manual/en/function.call-user-func-array.php

call_user_func_array('func',$myArgs);
dsf9zpds

dsf9zpds2#

如前所述,从PHP 5.6+开始,您可以(应该!)使用...标记(又名“splat运算符”,可变参数函数功能的一部分)轻松调用具有参数数组的函数:

<?php
function variadic($arg1, $arg2)
{
    // Do stuff
    echo $arg1.' '.$arg2;
}

$array = ['Hello', 'World'];

// 'Splat' the $array in the function call
variadic(...$array);

// 'Hello World'
  • 注意:数组项通过它们在数组中的***位置**Map到参数,而不是它们的键。

根据CarlosCarucce的评论,这种形式的参数解包是迄今为止所有情况下最快的方法。在某些比较中,它比call_user_func_array快5倍以上。

旁边

因为我认为这真的很有用(尽管与问题没有直接关系):你可以在函数定义中对splat操作符参数进行类型提示,以确保所有传递的值都与特定类型匹配。
(Just记住,这样做它必须是你定义的 * 最后一个 * 参数,并且它将传递给函数的所有参数捆绑到数组中。
这对于确保数组包含特定类型的项非常有用:

<?php

// Define the function...

function variadic($var, SomeClass ...$items)
{
    // $items will be an array of objects of type `SomeClass`
}

// Then you can call...

variadic('Hello', new SomeClass, new SomeClass);

// or even splat both ways

$items = [
    new SomeClass,
    new SomeClass,
];

variadic('Hello', ...$items);
qnzebej0

qnzebej03#

另外要注意的是,如果你想将一个示例方法应用于一个数组,你需要将函数传递为:

call_user_func_array(array($instance, "MethodName"), $myArgs);
r7xajy2e

r7xajy2e4#

为了完整起见,从PHP 5.1开始,这也可以工作:

<?php
function title($title, $name) {
    return sprintf("%s. %s\r\n", $title, $name);
}
$function = new ReflectionFunction('title');
$myArray = array('Dr', 'Phil');
echo $function->invokeArgs($myArray);  // prints "Dr. Phil"
?>

参见:http://php.net/reflectionfunction.invokeargs
对于方法,您使用ReflectionMethod::invokeArgs,并将对象作为第一个参数传递。

相关问题