web-dev-qa-db-fra.com

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

J'ai une fonction PHP qui prend un nombre variable d'arguments (en utilisant func_num_args() et func_get_args())), mais le nombre d'arguments que je souhaite transmettre fonction dépend de la longueur d'un tableau Y a-t-il un moyen de call a PHP fonctionner avec un nombre variable d'arguments?

110
nohat

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

Si le nombre d'arguments à passer dépend de la longueur d'un tableau, cela signifie probablement que vous pouvez les ranger eux-mêmes dans un tableau - et l'utiliser pour le second paramètre de call_user_func_array.

Les éléments de ce tableau que vous passez seront ensuite reçus par votre fonction en tant que paramètres distincts.


Par exemple, si vous avez cette fonction:

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

Vous pouvez intégrer vos paramètres dans un tableau, comme ceci:

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

Et, ensuite, appelez 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)

soit 3 paramètres; exactement comme si la fonction s’appelait de cette façon:

test(10, 'glop', 'test');
124
Pascal MARTIN

C'est maintenant possible avec PHP 5.6.x , en utilisant l'opérateur ... (également appelé opérateur splat 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' ) );
56
JCM

Dans un nouveau Php 5.6, vous pouvez utiliser ... operator Au lieu d'utiliser func_get_args() .

Ainsi, en utilisant cela, vous pouvez obtenir tous les paramètres que vous transmettez:

function manyVars(...$params) {
   var_dump($params);
}
44
Salvador Dali

Depuis PHP 5.6, une liste d’arguments variable peut être spécifiée avec le ... _ opérateur.

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)
#> }

Comme vous pouvez le voir, le ... l'opérateur collecte la liste variable d'arguments dans un tableau.

Si vous devez passer les arguments variables à une autre fonction, la commande ... peut toujours vous aider.

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

Depuis PHP 7, la liste d'arguments variable peut être obligée d'être tous du même type.

function do_something($first, int ...$all_the_others) { /**/ }
37
Daniele Orlando

Pour ceux qui cherchent un moyen de faire cela avec $object->method:

call_user_func_array(array($object, 'method_name'), $array);

J'ai réussi avec cela dans une fonction de construction qui appelle une variable nom_méthode avec des paramètres variables.

10
danilo

Vous pouvez simplement l'appeler.

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

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

Sortie:

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

4
Donnie C

Je suis surpris que personne ici n'ait simplement mentionné le fait de passer et de extrait ing. Par exemple:

function add($arr){
    extract($arr, EXTR_REFS);
    return $one+$two;
}
$one = 1;
$two = 2;
echo add(compact('one', 'two')); // 3

Bien sûr, cela ne fournit pas validation d'argument . Pour cela, tout le monde peut utiliser la fonction prévue: https://Gist.github.com/iautomation/8063fc78e9508ed427d5

2
iautomation

Une vieille question, je sais cependant, aucune des réponses ici ne fait vraiment du bon travail de simplement répondre à la question.

Je viens de jouer avec php et la solution ressemble à ceci:

function myFunction($requiredArgument, $optionalArgument = "default"){
   echo $requiredArgument . $optionalArgument;
}

Cette fonction peut faire deux choses:

S'il est appelé avec uniquement le paramètre requis: myFunction("Hi"), il affichera "Hi default"

Mais s'il est appelé avec le paramètre optionnel: myFunction("Hi","me"), il affichera "Hi me";

J'espère que cela aidera tous ceux qui cherchent cela plus tard.

1
Alex

Voici une solution utilisant la méthode magique __invoke

(Disponible depuis 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 la même classe:

$this('methodName', ['arg1', 'arg2', 'arg3']);

A partir d'une instance d'un objet:

$obj = new Foo;
$obj('methodName', ['arg1', 'arg2', 'arg3'])
0
Dieter Gribnitz