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?

Foi útil?

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)

ninguém

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'])
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top