Ответ 1
Вы можете использовать call_user_func_array()
, чтобы достичь этого:
call_user_func_array("range", $args);
, чтобы использовать ваш пример.
Python предоставляет оператор "*" для распаковки списка кортежей и предоставления им функции в качестве аргументов, например:
args = [3, 6]
range(*args) # call with arguments unpacked from a list
Это эквивалентно:
range(3, 6)
Кто-нибудь знает, есть ли способ достичь этого в PHP? Некоторые поисковые запросы по вариантам "PHP Unpack" ни разу не обнаружили ничего.. возможно, он назвал что-то другое в PHP?
Вы можете использовать call_user_func_array()
, чтобы достичь этого:
call_user_func_array("range", $args);
, чтобы использовать ваш пример.
В php5.6
добавлен оператор ...
. Используя это, вы можете избавиться от call_user_func_array()
для этой более простой альтернативы. Например, имея функцию
function add($a, $b){
return $a + $b;
}
и ваш массив $list = [4, 6];
(после php5.5 вы можете объявить массивы таким образом).
Вы можете вызвать свою функцию с помощью ...
:
echo add(...$list);
В некоторых сценариях вы можете рассмотреть возможность использования unpacking
, что возможно в php, аналогично python:
list($min, $max) = [3, 6];
range($min, $max);
Вот как я, по крайней мере, пришел к этому ответу.
Поиск в Google: PHP argument unpacking
Вы должны использовать call_user_func_array
call_user_func_array(array(CLASS, METHOD), array(arg1, arg2, ....))
http://www.php.net/call_user_func_array
или используйте отражение api http://www.php.net/oop5.reflection
<?php
function add(int ...$arr) { // typehint ready
return array_sum($arr);
}
var_dump(add(1, 2, 3, ...[1, 2, 3])); // int(12)
Еще один пример с... - оператором.
RFC: https://wiki.php.net/rfc/variadics