Eu me lembro que no PHP existe uma maneira de passar uma matriz como uma lista de argumentos para uma função, desreferenciando a matriz da func($arg1, $arg2)
maneira padrão . Mas agora estou perdido em como fazê-lo. Lembro-me da maneira de passar por referência, como "globar" os parâmetros recebidos ... mas não como remover a lista do array em uma lista de argumentos.
Pode ser tão simples quanto func(&$myArgs)
, mas tenho certeza que não é isso. Infelizmente, o manual do php.net não divulgou nada até agora. Não que eu tenha tido que usar esse recurso em particular nos últimos anos.
$args = [1,2,3]; function(...$args){}
callable
, que usa o mesmocall_user_func_array
, apenas com array onde o primeiro elemento é o objeto e o segundo é o método. Por exemplocall_user_func_array([$object, 'method'], $myArgs);
Como foi mencionado , no PHP 5.6+ você pode (deveria!) Usar o
...
token (também conhecido como "operador de splat", parte da funcionalidade das funções variadas) para chamar facilmente uma função com uma matriz de argumentos:Nota: os itens da matriz são mapeados para argumentos por sua posição na matriz, não por suas chaves.
De acordo com o comentário de CarlosCarucce , essa forma de descompactar argumentos é de longe o método mais rápido em todos os casos. Em algumas comparações, é mais de 5x mais rápido que
call_user_func_array
.a parte, de lado
Porque acho que isso é realmente útil (embora não esteja diretamente relacionado à pergunta): você pode digitar o parâmetro do operador splat na definição de sua função para garantir que todos os valores passados correspondam a um tipo específico.
(Lembre-se de que, fazendo isso, DEVE ser o último parâmetro definido e que agrupa todos os parâmetros passados para a função na matriz.)
Isso é ótimo para garantir que uma matriz contenha itens de um tipo específico:
fonte
call_user_func_array
. Então, se você estiver usando o php 5.6+, eu recomendaria este. Aqui é um teste , que foi citado no wiki oficial phpObserve também que, se você deseja aplicar um método de instância a uma matriz, precisa passar a função como:
fonte
$foo->bar()
exemplo na página vinculada sugere que deveria serarray($instance, "MethodName")
.call_user_func_array(array(parent, "__construct"), func_get_args());
Para completar, a partir do PHP 5.1, isso também funciona:
Consulte: http://php.net/reflectionfunction.invokeargs
Para métodos, você usa o ReflectionMethod :: invokeArgs e passa o objeto como primeiro parâmetro.
fonte