Python предоставляет оператор «*» для распаковки списка кортежей и передачи их функции в качестве аргументов, например:
args = [3, 6]
range(*args) # call with arguments unpacked from a list
Это эквивалентно:
range(3, 6)
Кто-нибудь знает, есть ли способ добиться этого в PHP? Поиск в Google вариантов "PHP Unpack" ничего не дал ... может быть, в PHP это называется по-другому?






Для этого вы можете использовать call_user_func_array():
call_user_func_array("range", $args);, чтобы использовать ваш пример.
Согласитесь с @jgivoni. Общая тенденция в PHP, впервые появившаяся в версии 7, а теперь и в PHP 8, заключается в отказе от неконтролируемых функций, таких как call_user_func_array(), func_get_args() и т. д., В пользу оператора с переменными числами "...". Теперь ... Я был бы очень признателен, если бы кто-нибудь мог сказать мне, как это сделать в python: $ m = 'getName'; $ name = $ obj -> $ m ();
Вы должны использовать 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
В php5.6 добавлен Распаковка аргумента через ... (оператор splat). Используя его, вы можете избавиться от 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
Очень хорошо. Я думал о ($min, $max) или {$min, $max}. Но list - это то, что я искал
<?php
function add(int ...$arr) { // typehint ready
return array_sum($arr);
}
var_dump(add(1, 2, 3, ...[1, 2, 3])); // int(12)
Другой пример с ... - operator.
RFC: https://wiki.php.net/rfc/variadics
Это похоже на старый ответ - теперь, вероятно, более уместно использовать оператор распаковки аргументов, см. Ответ @Salvador Dali