Como passar número variável de argumentos para uma função PHP
-
07-07-2019 - |
Pergunta
Eu tenho uma função PHP que leva um número variável de argumentos (usando func_num_args()
e func_get_args()
), mas o número de argumentos que deseja passar a função depende do comprimento de uma matriz. Existe uma maneira de Chamada a função de PHP com um número variável de argumentos?
Solução
Se você tem seus argumentos em uma matriz, você pode estar interessado pela função call_user_func_array
.
Se o número de argumentos que você deseja passar depende do comprimento de uma matriz, isso provavelmente significa que você pode embalá-los em uma matriz em si -. E uso que se para o segundo parâmetro de call_user_func_array
Os elementos da matriz que você passar, então, ser recebido por sua função como parâmetros distintos.
Por exemplo, se você tem essa função:
function test() {
var_dump(func_num_args());
var_dump(func_get_args());
}
Você pode embalar seus parâmetros em uma matriz, como este:
$params = array(
10,
'glop',
'test',
);
E, em seguida, chamar a função:
call_user_func_array('test', $params);
Este código será a saída:
int 3
array
0 => int 10
1 => string 'glop' (length=4)
2 => string 'test' (length=4)
ou seja, 3 parâmetros; exatamente como iof a função foi chamado desta maneira:
test(10, 'glop', 'test');
Outras dicas
Esta é agora possível com PHP 5.6.x , usando o ... operador (também conhecido como operador de splat em alguns idiomas):
Exemplo:
function addDateIntervalsToDateTime( DateTime $dt, DateInterval ...$intervals )
{
foreach ( $intervals as $interval ) {
$dt->add( $interval );
}
return $dt;
}
addDateIntervaslToDateTime( new DateTime, new DateInterval( 'P1D' ),
new DateInterval( 'P4D' ), new DateInterval( 'P10D' ) );
Em um novo Php 5.6 , você pode usar ... operator
em vez de usar func_get_args()
.
Assim, usando isso, você pode obter todos os parâmetros que você passa:
function manyVars(...$params) {
var_dump($params);
}
Desde PHP 5.6 , a lista de argumentos variável pode ser especificado com o operador ...
.
function do_something($first, ...$all_the_others)
{
var_dump($first);
var_dump($all_the_others);
}
do_something('this goes in first', 2, 3, 4, 5);
#> string(18) "this goes in first"
#>
#> array(4) {
#> [0]=>
#> int(2)
#> [1]=>
#> int(3)
#> [2]=>
#> int(4)
#> [3]=>
#> int(5)
#> }
Como você pode ver, o operador ...
recolhe a lista variável de argumentos em uma matriz.
Se você precisa passar os argumentos variáveis ??para outra função, a ...
ainda pode ajudá-lo.
function do_something($first, ...$all_the_others)
{
do_something_else($first, ...$all_the_others);
// Which is translated to:
// do_something_else('this goes in first', 2, 3, 4, 5);
}
Desde PHP 7 , a lista variável de argumentos podem ser forçados a ser todas do mesmo tipo também.
function do_something($first, int ...$all_the_others) { /**/ }
Para aqueles que procuram uma maneira de fazer isso com $object->method
:
call_user_func_array(array($object, 'method_name'), $array);
eu era bem sucedido com isso em uma função de construção que chama um method_name variável com parâmetros variáveis.
Você pode simplesmente chamá-lo.
function test(){
print_r(func_get_args());
}
test("blah");
test("blah","blah");
Output:
Array ([0] => bla) Array ([0] => bla [1] => bla)
Estou surpreso aqui mencionou simplesmente passando e extrato ing um array. Por exemplo:
function add($arr){
extract($arr, EXTR_REFS);
return $one+$two;
}
$one = 1;
$two = 2;
echo add(compact('one', 'two')); // 3
Claro, isso não fornece argumento de validação . Para isso, qualquer um pode usar o meu esperar função: https://gist.github.com/iautomation/8063fc78e9508ed427d5
Uma questão de idade, eu sei, no entanto, nenhuma das respostas aqui realmente fazer um bom trabalho de simplesmente responder à pergunta.
Eu apenas brinquei com php e os olhares solução como esta:
function myFunction($requiredArgument, $optionalArgument = "default"){
echo $requiredArgument . $optionalArgument;
}
Esta função pode fazer duas coisas:
Se a sua chamada com apenas o parâmetro desejado: myFunction("Hi")
Ele irá imprimir "Hi padrão"
Mas se ele é chamado com o parâmetro opcional: myFunction("Hi","me")
Ele irá imprimir "Hi-me";
Espero que isso ajude alguém que está olhando para este abaixo da estrada.
Aqui está uma solução usando o método mágico __invoke
(disponível desde o PHP 5.3)
class Foo {
public function __invoke($method=null, $args=[]){
if($method){
return call_user_func_array([$this, $method], $args);
}
return false;
}
public function methodName($arg1, $arg2, $arg3){
}
}
De dentro mesma classe:
$this('methodName', ['arg1', 'arg2', 'arg3']);
A partir de uma instância de um objeto:
$obj = new Foo;
$obj('methodName', ['arg1', 'arg2', 'arg3'])