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

2022-08-30 06:39:27

我似乎记得在PHP中有一种方法可以将数组作为函数的参数列表传递,从而以标准方式取消引用数组。但现在我迷失了如何做到这一点。我记得通过引用传递的方式,如何“glob”传入参数...而不是如何将数组取消列出到参数列表中。func($arg1, $arg2)

它可能像 一样简单,但我非常确定事实并非如此。但是,可悲的是,到目前为止,php.net 手册还没有透露任何内容。并不是说我在过去一年左右的时间里不得不使用这个特定的功能。func(&$myArgs)


答案 1

答案 2

如前所述,从 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'

注意:数组项通过其在 数组中的位置(而不是键)映射到参数。

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

旁白

因为我认为这非常有用(尽管与问题没有直接关系):您可以在函数定义中键入提示 splat 运算符参数,以确保所有传递的值都与特定类型匹配。

(请记住,这样做必须是您定义的最后一个参数,并且它将传递给函数的所有参数捆绑到数组中。

这对于确保数组包含特定类型的项目非常有用:

<?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);