119 votes

Comment passer un nombre variable d'arguments à une fonction PHP

J'ai une fonction PHP qui prend un nombre variable d'arguments (à l'aide d' func_num_args() et func_get_args()), mais le nombre d'arguments, j'ai envie de passer à la fonction dépend de la longueur d'un tableau. Est-il possible d' appeler une fonction PHP avec un nombre variable d'arguments?

134voto

Pascal MARTIN Points 195780

Si vous avez vos arguments dans un tableau, vous pourriez être intéressé par l' call_user_func_array fonction.

Si le nombre d'arguments que vous souhaitez passer dépend de la longueur d'un tableau, cela signifie probablement que vous pouvez emballer dans un tableau, et l'utiliser pour le deuxième paramètre de call_user_func_array.

Les éléments de ce tableau vous passe va être reçu par votre fonction de différents paramètres.


Par exemple, si vous avez cette fonction :

function test() {
  var_dump(func_num_args());
  var_dump(func_get_args());
}

Vous pouvez emballer vos paramètres dans un tableau, comme ceci :

$params = array(
  10,
  'glop',
  'test',
);

Et, puis, à l'appel de la fonction :

call_user_func_array('test', $params);

Ce code sera la sortie :

int 3

array
  0 => int 10
  1 => string 'glop' (length=4)
  2 => string 'test' (length=4)

c'est à dire, 3 paramètres ; exactement comme si la fonction a été appelée de cette façon :

test(10, 'glop', 'test');

62voto

JCM Points 1259

C'est maintenant possible avec PHP 5.6.x, à l'aide de l'opérateur " ... " (aussi connu comme splat opérateur dans certaines langues):

Exemple:

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' ) );

50voto

Salvador Dali Points 11667

Dans une nouvelle Php 5.6 (actuellement en bêta), vous pouvez utiliser ... operator au lieu d'utiliser func_get_args().

Donc, avec cela, vous pouvez obtenir tous les paramètres que vous passez:

function manyVars(...$params) {
   var_dump($params);
}

11voto

danilo Points 7

Pour ceux qui recherchent un moyen de le faire avec $objet->méthode:
call_user_func_array(array($objet, 'method_name'), $array);

J'ai eu du succès avec ce dans une construction de la fonction qui appelle une variable method_name avec des paramètres variables.

4voto

Donnie C Points 169

Vous pouvez tout aussi bien l'appeler.

function test(){        
     print_r(func_get_args());
}

test("blah");
test("blah","blah");

Sortie:

Array ( [0] => bla ) Array ( [0] => bla [1] => bla )

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X