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.
Мои вопросы:
примечание: я проверил документы для других функций массива, и, например, 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 () и array_unshift () теперь также могут вызываться с одним аргументом, что особенно удобно в отношении. оператор распространения
Кажется, это была и ошибка документации, и отсутствующая функция. Yay для PHP 7.3 разработчиков для реализации этого!
Других решений пока нет …