代码之家  ›  专栏  ›  技术社区  ›  vaxquis user2577497

array_push()实际需要多少参数?

  •  1
  • vaxquis user2577497  · 技术社区  · 8 年前

    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)都允许函数中的空变量(通常会导致no-op)。php没有,至少在php 7.1和7.2中没有。

    虽然有相似的语法定义, array_merge 还有许多其他人接受空变量并使用上述splat语法正确工作:

    var_dump( array_merge(['foo'], ...[]) ); // works for me.
    

    我的问题是:

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

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

    1 回复  |  直到 8 年前
        1
  •  3
  •   vaxquis user2577497    8 年前

    好吧,这个巨大的谜团似乎已经解开了:当我们深入探究 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.0字母1

    array_push()和array_unshift()现在也可以用单个参数调用,这特别方便wrt。扩散算子。

    这似乎既是一个文档错误,也是一个缺失的功能。对PHP7.3开发人员来说,实现这一点真是太棒了!

    推荐文章