Сколько параметров на самом деле ожидает array_push ()?

http://php.net/manual/en/function.array-push.php ясно показывает сигнатуру функции, причем variadic не является обязательным:

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. (а) если это предполагаемое поведение, каково его обоснование в свете вышесказанного?
  3. (б) если это ошибка, почему это происходит?

примечание: я проверил документы для других функций массива, и, например, http://php.net/manual/en/function.compact.php, http://php.net/manual/en/function.array-merge.php и т.д. покажите список параметров точно так, как ожидалось).

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 () теперь также могут вызываться с одним аргументом, что особенно удобно в отношении. оператор распространения

Кажется, это была и ошибка документации, и отсутствующая функция. Yay для PHP 7.3 разработчиков для реализации этого!

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]