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 desejo passar a função depende do comprimento de uma matriz. Existe uma maneira de chamar uma função PHP com um número variável de argumentos?
php
variadic-functions
nohat
fonte
fonte
Respostas:
Se você tem seus argumentos em uma matriz, pode se interessar pela
call_user_func_array
função.Se o número de argumentos que você deseja passar depende do comprimento de um array, isso provavelmente significa que você pode empacotá-los em um array - e usar esse como o segundo parâmetro de
call_user_func_array
.Os elementos desse array que você passar serão recebidos por sua função como parâmetros distintos.
Por exemplo, se você tem esta função:
Você pode empacotar seus parâmetros em uma matriz, assim:
E, então, chame a função:
Este código terá como resultado:
ou seja, 3 parâmetros; exatamente como iof a função era chamada desta forma:
fonte
Isso agora é possível com PHP 5.6.x , usando o operador ... (também conhecido como operador splat em algumas linguagens):
Exemplo:
fonte
Em um novo Php 5.6 , você pode usar em
... operator
vez de usarfunc_get_args()
.Então, usando isso, você pode obter todos os parâmetros que passar:
fonte
Desde o PHP 5.6 , uma lista de argumentos variáveis pode ser especificada com o
...
operador.Como você pode ver, o
...
operador coleta a lista de variáveis de argumentos em uma matriz.Se você precisar passar os argumentos variáveis para outra função, o
...
ainda pode ajudá-lo.Desde o PHP 7 , a lista de argumentos variáveis pode ser forçada a ser todos do mesmo tipo também.
fonte
Para quem procura uma maneira de fazer isso com
$object->method
:Tive sucesso com isso em uma função de construção que chama uma variável method_name com parâmetros variáveis.
fonte
$object->method_name(...$array);
$object->method_name(&...$args);
Você pode simplesmente chamá-lo.
Resultado:
Matriz ([0] => blá) Matriz ([0] => blá [1] => blá)
fonte
Estou surpreso que ninguém aqui tenha mencionado simplesmente passar e extrair um array. Por exemplo:
Claro, isso não fornece validação de argumento . Para isso, qualquer pessoa pode usar minha função expect: https://gist.github.com/iautomation/8063fc78e9508ed427d5
fonte
Uma velha pergunta, eu sei, no entanto, nenhuma das respostas aqui realmente faz um bom trabalho de simplesmente responder à pergunta.
Acabei de brincar com php e a solução é esta:
Essa função pode fazer duas coisas:
Se for chamado apenas com o parâmetro necessário:
myFunction("Hi")
Irá imprimir "Hi default"Mas se for chamado com o parâmetro opcional:
myFunction("Hi","me")
Vai imprimir "Hi me";Espero que isso ajude quem está procurando por isso no futuro.
fonte
Aqui está uma solução usando o método mágico __invoke
(Disponível desde o php 5.3)
Dentro da mesma classe:
De uma instância de um objeto:
fonte
call_user_func_array
como declarado pela resposta mais votada em 2009. Talvez haja um ponto em colocar um extra em__invoke
torno disso - mas eu não vejo isso.