Tips PHP : connaissez-vous les paramètres nommés ?

Anthony TENNERIELLO
norsys-octogone
Published in
3 min readJan 11, 2024

Les paramètres nommés sont arrivés avec PHP 8.0 et une fois que je vous les aurai présentés, vous vous demanderez sûrement : « mais pourquoi je ne les ai pas découverts plus tôt ? ».

De quoi s’agit-il ?

Comme l’explique très bien la documentation PHP :

Les arguments nommés permettent de passer les arguments à une fonction en s’appuyant sur le nom du paramètre, au lieu de la position du paramètre.

Un exemple vaut mille mots. Prenons la méthode request fournie avec la classe Symfony\Component\BrowserKit\AbstractBrowser, qui nous permet d’effectuer des tests d’appel HTTP avec Symfony.

Ci-dessous la signature de la méthode.

request(
string $method,
string $uri,
array $parameters = [],
array $files = [],
array $server = [],
string $content = null,
bool $changeHistory = true
): Crawler

Imaginons que je souhaite envoyer une requête avec des paramètres et en spécifiant le type de contenu.

Avec PHP 7, nous pourrions réaliser le code suivant :

$client->request(
'POST',
'/foo',
[],
[],
['CONTENT_TYPE' => 'application/json'],
'{"data":[]}'
);

Voilà ce que PHP 8 nous offre :

$client->request(
method: 'POST',
uri: '/foo',
server: ['CONTENT_TYPE' => 'application/json'],
content: '{"data":[]}'
);

N’est-ce pas magnifique ? 🤩

Il n’est plus nécessaire de fournir les paramètres optionnels que nous n’utilisons pas. Le code est plus concis et auto-documenté. Nous savons exactement à quoi chaque paramètre correspond. Enfin, nous n’avons plus à nous soucier de l’ordre dans lequel nous les fournissons.

Les paramètres nommés pour apporter plus de cohérence à PHP

Prenons un autre exemple. Vous avez forcément déjà croisé les fonctions PHP liées à la manipulation de tableau (array_*). Il est bien évidemment toujours nécessaire de fournir le tableau sur lequel nous travaillons en paramètre, mais pas toujours à la même position.

Prenons l’exemple des deux fonctions PHP suivantes :

array_map(?callable $callback, array $array, array ...$arrays): array
array_filter(array $array, ?callable $callback = null, int $mode = 0): array

C’est un peu déroutant d’avoir deux fonctions aussi proches dans leur fonctionnement et qui pourtant diffèrent dans leur utilisation. En effet, dans les deux cas, mon besoin est d’appliquer une fonction sur chaque élément d’un tableau.

Grâce à PHP 8, je peux réaliser l’exemple suivant :

class VideoGame
{
public function __construct(
public string $title,
public int $releaseYear,
) {
}
}

$videoGames = [
new VideoGame(title: 'Marvel\'s Spider-Man 2', releaseYear: 2023),
new VideoGame(
title: 'Hogwarts Legacy : L\'Héritage de Poudlard',
releaseYear: 2023
),
new VideoGame(title: 'Elden Ring', releaseYear: 2022),
new VideoGame(title: 'Stray', releaseYear: 2022),
];

$currentYear = (int) date('Y');

$currentYearVideoGames = array_filter(
array: $videoGames,
callback: fn (VideoGame $game) => $game->releaseYear === $currentYear
);

$currentYearVideoGameTitles = array_map(
array: $currentYearVideoGames,
callback: fn (VideoGame $game) => $game->title
);

var_dump($currentYearVideoGameTitles);
/*
array(2) {
[0]=> string(21) "Marvel's Spider-Man 2"
[1]=> string(41) "Hogwarts Legacy : L'Héritage de Poudlard"
}
*/

J’ai fourni mes paramètres en suivant le même ordre pour les deux fonctions alors que l’ordre de leur signature est inversé. Le code ci-dessus bénéficie d’une meilleure lisibilité et réduit le risque d’erreur. En outre, vous apportez plus de cohérence aux fonctions PHP en les utilisant toujours de la même manière.

Le cas d’une migration de version

Je vais vous présenter un dernier exemple de l’intérêt des arguments nommés. Récemment PHP a modifié la signature de la fonction implode.

Documentation PHP de la fonction implode

L’ordre des paramètres a été inversé entre la version 7.4 et 8.0 de PHP.

A l’avenir, l’utilisation des paramètres nommés pourrait vous faire gagner du temps lors de vos futures montées de version de PHP.

Alors, convaincu ?

J’espère que ces exemples ont su vous démontrer les avantages des paramètres nommés. Je les utilise très régulièrement pour le gain de temps et de lisibilité qu’ils apportent. J’apprécie énormément le fait de savoir exactement à quel argument correspond chaque paramètre que je fournis.

--

--