array_push() 实际需要多少个参数?
How many parameters does array_push() actually expect?
http://php.net/manual/en/function.array-push.php 清楚地显示了函数的签名,可变参数是完全可选的:
int array_push ( array &$array [, mixed $... ] )
我认为,当将 array_push
与 splat 运算符一起使用时,非常希望它接受空的可变参数,例如允许这样的代码:
<?php
function add( array $arr1, array $arr2 ) {
return \array_push($arr1, ...$arr2);
}
echo add(['foo'], ['bar']); // OK, returns 2
echo add(['foo'], []); // should be OK, but ain't currently - raises an E_WARNING
?>
出于这个原因,许多语言(例如 Java)允许在函数中使用空变量(通常会导致无操作)。 PHP 没有,至少在 PHP 7.1 和 7.2 中没有。
OTOH,尽管共享相似的语法定义,array_merge
和许多其他接受空可变参数并使用上述 splat 语法正确工作:
var_dump( array_merge(['foo'], ...[]) ); // works for me.
我的问题是:
- 这实际上是预期的行为和文档错误、实施中的错误还是其他原因?
- (a) 如果这是有意为之的行为,那么根据上述情况,其背后的基本原理是什么?
- (b) 如果这是一个错误,为什么会发生?
注意:我已经检查了其他数组函数的文档,例如http://php.net/manual/en/function.compact.php, http://php.net/manual/en/function.array-merge.php 等。完全按照预期显示参数列表)。
好吧,这个大谜团似乎解开了:在浏览 https://github.com/php/php-src/blob/master/ext/standard/array.c 中的提交时,我发现 array_push
:
ZEND_PARSE_PARAMETERS_START(1, -1)
Z_PARAM_ARRAY_EX(stack, 0, 1)
Z_PARAM_VARIADIC('+', args, argc)
ZEND_PARSE_PARAMETERS_END();
最近更改了第一行,从 ZEND_PARSE_PARAMETERS_START(2, -1)
开始,使问题不存在。
https://github.com/php/php-src/commit/f7f48643e779111b23b546689b9fbb4e3affe1e7
引用:
php-7.3.0alpha1
array_push() and array_unshift() can now also be called with a single argument, which is particularly convenient wrt. the spread operator.
这似乎既是文档错误又是功能缺失。赞成 PHP 7.3 开发人员实现了这个!
http://php.net/manual/en/function.array-push.php 清楚地显示了函数的签名,可变参数是完全可选的:
int array_push ( array &$array [, mixed $... ] )
我认为,当将 array_push
与 splat 运算符一起使用时,非常希望它接受空的可变参数,例如允许这样的代码:
<?php
function add( array $arr1, array $arr2 ) {
return \array_push($arr1, ...$arr2);
}
echo add(['foo'], ['bar']); // OK, returns 2
echo add(['foo'], []); // should be OK, but ain't currently - raises an E_WARNING
?>
出于这个原因,许多语言(例如 Java)允许在函数中使用空变量(通常会导致无操作)。 PHP 没有,至少在 PHP 7.1 和 7.2 中没有。
OTOH,尽管共享相似的语法定义,array_merge
和许多其他接受空可变参数并使用上述 splat 语法正确工作:
var_dump( array_merge(['foo'], ...[]) ); // works for me.
我的问题是:
- 这实际上是预期的行为和文档错误、实施中的错误还是其他原因?
- (a) 如果这是有意为之的行为,那么根据上述情况,其背后的基本原理是什么?
- (b) 如果这是一个错误,为什么会发生?
注意:我已经检查了其他数组函数的文档,例如http://php.net/manual/en/function.compact.php, http://php.net/manual/en/function.array-merge.php 等。完全按照预期显示参数列表)。
好吧,这个大谜团似乎解开了:在浏览 https://github.com/php/php-src/blob/master/ext/standard/array.c 中的提交时,我发现 array_push
:
ZEND_PARSE_PARAMETERS_START(1, -1)
Z_PARAM_ARRAY_EX(stack, 0, 1)
Z_PARAM_VARIADIC('+', args, argc)
ZEND_PARSE_PARAMETERS_END();
最近更改了第一行,从 ZEND_PARSE_PARAMETERS_START(2, -1)
开始,使问题不存在。
https://github.com/php/php-src/commit/f7f48643e779111b23b546689b9fbb4e3affe1e7
引用:
php-7.3.0alpha1
array_push() and array_unshift() can now also be called with a single argument, which is particularly convenient wrt. the spread operator.
这似乎既是文档错误又是功能缺失。赞成 PHP 7.3 开发人员实现了这个!