web-dev-qa-db-fra.com

Passer un tableau en tant qu’argument, pas un tableau, dans PHP

Il me semble me souvenir que dans PHP il existe un moyen de passer un tableau sous forme de liste d’arguments pour une fonction, en déréférencant le tableau dans la manière standard func($arg1, $arg2). Mais maintenant Je ne sais pas comment le faire, je me souviens de la manière de passer par référence, de "glober" les paramètres entrants ... mais pas de la façon dont le tableau serait défiguré en une liste d'arguments.

C'est peut-être aussi simple que func(&$myArgs), mais je suis sûr que ce n'est pas ça. Mais, malheureusement, le manuel de php.net n’a rien divulgué à ce jour. Ce n’est pas que j’ai eu à utiliser cette fonctionnalité depuis environ un an.

141
Robert K
169
vartec

Comme cela a été mentionné , à partir de PHP 5.6+ vous pouvez (devriez!) Utiliser le ... _ jeton (également appelé "opérateur splat", composant de la fonctionnalité fonctions variadiques ) permettant d’appeler facilement une fonction avec un tableau d’arguments:

<?php
function variadic($arg1, $arg2)
{
    // Do stuff
    echo $arg1.' '.$arg2;
}

$array = ['Hello', 'World'];

// 'Splat' the $array in the function call
variadic(...$array);

// 'Hello World'

Remarque: les éléments de tableau sont associés aux arguments par leur position dans le tableau, pas leurs clés.

Selon commentaire de CarlosCarucce , cette forme de décompression d'arguments est de loin la méthode la plus rapide . Dans certaines comparaisons, il est 5 fois plus rapide que call_user_func_array.

De côté

Parce que je pense que cela est vraiment utile (bien que ce ne soit pas directement lié à la question): vous pouvez type-hint le paramètre opérateur splat dans votre définition de fonction pour vous assurer que toutes les valeurs transmises correspondent à un type spécifique.

(Rappelez-vous simplement que faire cela [~ # ~] doit [~ # ~] être le dernier paramètre définir et qu’il regroupe tous les paramètres transmis à la fonction dans le tableau.)

C'est très bien pour s'assurer qu'un tableau contient des éléments d'un type spécifique:

<?php

// Define the function...

function variadic($var, SomeClass ...$items)
{
    // $items will be an array of objects of type `SomeClass`
}

// Then you can call...

variadic('Hello', new SomeClass, new SomeClass);

// or even splat both ways

$items = [
    new SomeClass,
    new SomeClass,
];

variadic('Hello', ...$items);
122
simonhamp

Notez également que si vous souhaitez appliquer une méthode d'instance à un tableau, vous devez transmettre la fonction en tant que:

call_user_func_array(array($instance, "MethodName"), $myArgs);
81
Jeff Ober

Par souci d’exhaustivité, à partir de PHP 5.1, cela fonctionne aussi:

<?php
function title($title, $name) {
    return sprintf("%s. %s\r\n", $title, $name);
}
$function = new ReflectionFunction('title');
$myArray = array('Dr', 'Phil');
echo $function->invokeArgs($myArray);  // prints "Dr. Phil"
?>

Voir: http://php.net/reflectionfunction.invokeargs

Pour les méthodes, utilisez plutôt ReflectionMethod :: invokeArgs et transmettez l'objet en tant que premier paramètre.

10
DanMan