【问题标题】:How many parameters does array_push() actually expect?array_push() 实际期望多少个参数?
【发布时间】:2018-07-09 17:23:13
【问题描述】:

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.

我的问题是:

  1. 这实际上是预期的行为和文档错误、实施中的错误还是其他原因?
  2. (a) 如果这是一种预期行为,鉴于上述情况,其背后的基本原理是什么?
  3. (b) 如果这是一个错误,为什么会发生?

注意:我已经检查了其他数组函数的文档,例如http://php.net/manual/en/function.compact.phphttp://php.net/manual/en/function.array-merge.php 等完全按照预期显示参数列表。

【问题讨论】:

  • 扩展运算符似乎不会影响函数的运行方式,它只是控制 PHP 分配参数的方式。 array_merge 只有 1 个必需参数,array_push 需要 2 个。

标签: php language-lawyer variadic-functions array-push


【解决方案1】:

嗯,这个大谜团似乎解开了:在查看 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() 和 array_unshift() 现在也可以使用单个参数调用,这特别方便。扩展运算符。

这似乎是文档错误和缺失的功能。为 PHP 7.3 开发人员实现这一点赞!

【讨论】:

    猜你喜欢
    • 2015-01-03
    • 1970-01-01
    • 1970-01-01
    • 2019-06-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多