Aller au contenu

PHP : décompression d'arguments et arguments nommés

Au fil des versions, PHP offre de plus en plus de souplesse pour transmettre des arguments à une fonction. La syntaxe suivante est désormais possible :

<?php
example(1, ...['arg3' => 3], arg5: 5);

Il était temps que je me mette à la page. Du coup, je vous partage ça...

1. Opérateur de décomposition ...

Disponible depuis PHP 5.6, il est aussi appelé splat operator ou unpacking operator. Il permet de faire 2 choses différentes :

1.1 Fonctions variables (variadic functions)

Il peut servir à définir des fonctions variables qui prennent un nombre indéterminé de paramètres :

<?php
function variadicFunction(...$args) {
  foreach ($args as $val) {
    echo $val;
  }
}
variadicFunction('val1', 'val2', 'val3');
Les arguments sont accessible sous forme d'un tableau associatif.

1.2 Décompression de tableau

Pour la suite de l'article, nous allons plutôt utiliser la fonction suivante

<?php
function example($arg1, $arg2=0, $arg3=0, $arg4=0, $arg5=0) {
  // ...
}

Autant ne pas la répéter 15 fois...

L'opérateur ... peut aussi servir à l'inverse : transmettre à la fonction chaque élément d'un tableau dans des arguments distincts :

<?php
// plutôt que ceci...
variadicFunction(1, 2, 3, 4, 5);

// ...on peut faire cela...
$array = [1, 2, 3, 4, 5]
variadicFunction(...$array);

// ...ou directement (intérêt plus limité)
variadicFunction(...[1, 2, 3, 4, 5]);
Dans le cas présent, ils sont transmis dans l'ordre fourni.

2. Arguments nommés (depuis PHP 8.0)

Dans une syntaxe assez similaire à Python, PHP autorisé désormais à nommer les arguments optionnels.

<?php
example(1, 0, 0, 0, 5);
// ... est équivalent à :
example(1, arg5=5);
Cela évite de transmettre inutilement à la main des valeurs par défaut pour des arguments dont on se fout.

3. Arguments nommés & opérateur de décompression

Les deux peuvent être utilisé lors d'un même appel de fonction, et ce de deux manières différentes :

3.1 Utilisés ensemble

L'opérateur de décompression — s'il est utilisé avec un tableau associatif — fera le lien entre les clés du tableau et les noms de variables :

<?php
$args = ['arg3' => 3, 'arg5': 5];
example(1, ...$args);
Ici, arg2 et arg4 gardent leurs valeurs par défaut, tandis que arg3 et arg5 récupèrent les valeurs du tableau.

3.2 Utilisés en parallèle

Il est aussi possible d'utiliser les 2 syntaxes au sein d'un même appel :

<?php
example(1, ...['arg3' => 3], arg5: 5);

Pour remettre un peu au clair, voici ce qu'il se passe pour chaque argument :

  1. argument requis transmis : vaudra 1
  2. argument facultatif non transmis : vaudra 0
  3. argument facultatif transmis par tableau associatif (ce qui ciblera l'argument de façon « nommée ») : vaudra 3
  4. argument facultatif non transmis : vaudra 0
  5. argument facultatif transmis de façon « nommée » : vaudra 5

3.3 Attention aux doublons

Il ne faut évidemment pas mentionner un même argument 2 fois, au risque de recevoir une Fatal error :

<?php
example(1, ...['arg5' => 3], arg5: 5);

Référence (php.net)

Keep spreading and code on!