PHP可变长度参数?
在Python和其他语言中,可变长度参数列表有特殊的语法:PHP可变长度参数?,php,function,variadic-functions,Php,Function,Variadic Functions,在Python和其他语言中,可变长度参数列表有特殊的语法: def do_something(*args): # do something do_something(1, 2, 3, 4, 5, ...) # arbitrarily long list 我正在阅读PHP手册,上面说: PHP4及以上版本支持 中的可变长度参数列表 用户定义的函数。这真是 非常简单,使用func_num_args(), func_get_arg()和func_get_args() 功能 不需要特殊语法,
def do_something(*args):
# do something
do_something(1, 2, 3, 4, 5, ...) # arbitrarily long list
我正在阅读PHP手册,上面说:
PHP4及以上版本支持
中的可变长度参数列表
用户定义的函数。这真是
非常简单,使用func_num_args(),
func_get_arg()和func_get_args()
功能
不需要特殊语法,并且
参数列表可能仍然是显式的
提供函数定义和
一切正常
我得到第一部分。您可以将任意多的参数传递给不带参数的函数,然后使用func\u get\u args()
等将它们作为数组获取。不过,我不太明白第二部分的意思
所以,我的问题是,对于变长参数是否有一些特殊的语法,或者一些我不知道的最佳实践?手册中建议的方法充其量看起来很笨拙,使函数看起来好像不带任何参数(除非我做错了)。我应该不尝试使用这个语言功能吗?与Python的
*
操作符或C#的参数
关键字不同,在PHP中,您甚至不必指定可变长度参数。第二部分开始时,“不需要特殊语法。”
至于第二段的其余部分:如果您想指定在可变长度参数之前的任何必需或不相关的参数,请在函数签名中指定它们,以便函数能够处理这些参数。然后,要获取可变长度参数,请从func\u get\u args()
中删除所需的变量,如下所示:
function func($required) {
// Contains all arguments that come after $required
// as they were present at call time
$args = array_slice(func_get_args(), 1);
}
您不必这样做(您仍然可以从
func\u get\u args()
中进行切片,并相应地使用其不同的元素),但它确实使您的代码更加自我记录。对于变长参数函数没有特殊的语法
只需使用func_num_args()和func_get_args()函数即可获取参数
例如:
function callMe(){
if(func_num_args() == 0){
echo 'No arguments =)';
}else{
var_dump(func_get_args());
}
}
我通常这样做是为了避免不断更改函数,并避免参数顺序上的错误
function any_function($ops=array())
{
}
$ops = array('name'=>1, 'type'=>'simplexml', 'callback'=>...);
下面是一个更现实的例子:
function Average()
{
$result = 0;
$arguments = func_get_args();
foreach ($arguments as $argument)
{
$result += $argument;
}
return ($result / max(1, func_num_args()));
}
Average(1, 2, 3, 4, 5); // 3
这被称为。第二部分基本上是说,一旦开始使用变量参数函数,那么
function average() { ... }
function average(arg1, arg2, arg3) { ... }
工作方式相同,只是第二个版本中明确列出了3个参数。仅此而已,不要试图对手册页进行更多的阅读。由于PHP5.6,因此可以使用
..
运算符指定变量参数列表
function do_something($first, ...$all_the_others)
{
var_dump($first);
var_dump($all_the_others);
}
do_something('this goes in first', 2, 3, 4, 5);
#> string(18) "this goes in first"
#>
#> array(4) {
#> [0]=>
#> int(2)
#> [1]=>
#> int(3)
#> [2]=>
#> int(4)
#> [3]=>
#> int(5)
#> }
如您所见,…
运算符收集数组中的变量参数列表
如果需要将变量参数传递给另一个函数,…
仍然可以帮助您
function do_something($first, ...$all_the_others)
{
do_something_else($first, ...$all_the_others);
// Which is translated to:
// do_something_else('this goes in first', 2, 3, 4, 5);
}
由于php7,参数的变量列表也可以强制为同一类型的all
function do_something($first, int ...$all_the_others) { /**/ }
我更想为可变长度参数命名,但谢谢,这是有用的信息。这是一个很酷的模式,但是
array\u slice(func\u get\u args(),1)
在PHP5.3中会抛出警告,在5.4中会抛出致命错误-修复方法是将func\u get\u args()
括在括号中,如array\u splice((func\u get\u args()),1)
@Shrapnel这是一种PHP哲学,不是吗?谁会关心其他人,我只会产生任何东西?PHP支持评论。够了。如果你想编码,就不要喋喋不休地谈论代码。如果用户传递了错误的参数,或者拼错了其中一个参数,那么你也就失去了引发错误的好处。优点和缺点。我不会说不正确,我更喜欢关联键,它应该更可读,而不是索引键。我只是讨厌将数组传递给函数。键入所有这些分隔符太长,因此自动完成将不知道参数(对于ide用户)