2010-01-22 3 views
10

Existe-t-il un moyen de définir une fonction en PHP qui vous permet de définir une quantité variable de paramètres?PHP: Définir la fonction avec le nombre variable de paramètres?

dans la langue que je suis plus familier avec elle est comme ceci:

function myFunction(...rest){ /* rest == array of params */ return rest.length; } 

myFunction("foo","bar"); // returns 2; 

Merci!

Répondre

32

Oui. Utilisez func_num_args() et func_get_arg() pour obtenir les arguments:

<?php 
    function dynamic_args() { 
     echo "Number of arguments: " . func_num_args() . "<br />"; 
     for($i = 0 ; $i < func_num_args(); $i++) { 
      echo "Argument $i = " . func_get_arg($i) . "<br />"; 
     } 
    } 

    dynamic_args("a", "b", "c", "d", "e"); 
?> 

En PHP 5.6+, vous pouvez maintenant utiliser variadic functions:

<?php 
    function dynamic_args(...$args) { 
     echo "Number of arguments: " . count($args) . "<br />"; 
     foreach ($args as $arg) { 
      echo $arg . "<br />"; 
     } 
    } 

    dynamic_args("a", "b", "c", "d", "e"); 
?> 
+2

assez sûr 'func_get_args () 'est ce que vous voulez réellement utiliser à la place de cette première solution verbeuse. – Toskan

0

Je vous encourage à passer un tableau dans votre fonction, de cette façon vous pouvez avoir autant de paramètres différents stockés dans ce tableau. Il y a beaucoup d'opérations que vous pouvez effectuer sur le tableau une fois qu'il est dans la fonction pour obtenir les informations dont vous avez besoin.

$array = array(); 
$array[0] = "a"; 
$array[1] = 1; 

myFunction($array); 
6

Vous pouvez accepter un nombre variable d'arguments à une fonction, tant qu'il ya assez pour remplir tous les arguments déclarés.

<?php 

function test ($a, $b) { } 

test(3); // error 
test(4, 5); // ok 
test(6,7,8,9) // ok 

?> 

Pour accéder aux arguments non identifiés supplémentaires passés à test(), vous utilisez les fonctions func_get_args(), func_num_args() et func_get_arg($i):

<?php 

// Requires at least one param, $arg1 
function test($arg1) { 

    // func_get_args() returns all arguments passed, in order. 
    $args = func_get_args(); 

    // func_num_args() returns the number of arguments 
    assert(count($args) == func_num_args()); 

    // func_get_arg($n) returns the n'th argument, and the arguments returned by 
    // these functions always include those named explicitly, $arg1 in this case 
    assert(func_get_arg(0) == $arg1); 

    echo func_num_args(), "\n"; 
    echo implode(" & ", $args), "\n"; 

} 

test(1,2,3); // echo "1 & 2 & 3" 

?> 
1

J'aime prendre une approche Javascript-esque avec mes paramètres PHP . Cela permet un meilleur réglage des "options" et de leurs valeurs par défaut (que je vais regarder momentanément). Par exemple, supposons que vous ayez une fonction qui renvoie une plage de fois dans un tableau. Le paramètre 1 est l'heure de début, le paramètre 2 est l'heure de fin, le paramètre 3 est l'intervalle de temps et toute option ultérieure est facultative (comme "format" => "24 heures", "include_seconds" => TRUE, etc.).

Je définirais la fonction comme ceci:

function returnTimeInterval($startTime, $endTime, $interval, $options = array()) 
{ 
    // the first thing to do is merge options in with our defaults 
    $options = array_merge(array(
     "format" => "24-hour", 
     "include_seconds => TRUE 
     // etc. 
    ), $options); 

Cela permet le réglage des paramètres par défaut dans la fonction qui peut ensuite être surchargée, ce qui est assez cool. Bien sûr, vous devez veiller à ce que les options étranges et non utilisées ne soient pas transmises, mais je vous laisse le soin de le faire. :)

+0

'array_intersect_key()' aidera à éviter les options inconnues. – Walf

2

ou seulement

function printArgs() { 

foreach (func_get_args() as $arg){ 
    echo $arg; 
} 
} 

printArgs("1 ", "2 ", "three "); 

sorties 1 2 three

2

Bien que cette question est très ancienne: En fait en PHP 5.6+, vous pouvez écrire exactement ce que vous avez écrit: D

Questions connexes