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');
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]);
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);
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);
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 :
- argument requis transmis : vaudra 1
- argument facultatif non transmis : vaudra 0
- argument facultatif transmis par tableau associatif (ce qui ciblera l'argument de façon « nommée ») : vaudra 3
- argument facultatif non transmis : vaudra 0
- 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!