PHP 8.5 : quoi de neuf ?

PHP 8.5 : quoi de neuf ?

Développement

PHP 8.5 est la !

PHP 8.5 est dispo depuis quelques jours, et avec lui son lot de petites nouveautés ! :br:br
Focus sur 2 des nouveautés que j'attendais le plus.


1. L’opérateur pipe |> : mon petit préféré

PHP 8.5 introduit l’opérateur pipe (|>), qui permet d’enchaîner des callables, à lire de haut en bas.

Avant PHP 8.5

$slug = urlencode(
    trim(
        strtolower($title)
    )
);
$slug = urlencode(
    preg_replace('/\s+/', '-',
        trim(
            strtolower($title)
        )
    )
);

Avec PHP 8.5

$slug = $title
|> strtolower(...)                  // minuscules
|> trim(...)                        // enlever espaces début/fin
|> urlencode(...);                  // encodage URL final

On est quand même sur un truc vachement plus lisible !

On a quand même quelques limites :

  • les callables ne doivent avoir qu'un seul paramètre obligatoire
  • les callables doivent retourner une valeur
  • la valeur de retour de chaque pipe sert d'entrée au pipe suivant

Le code suivant, par exemple, ne marchera pas :

$slug = $title
|> strtolower(...)                  
|> trim(...)                        
|> preg_replace('/\s+/', '-', ...)  // marchera pas, plus d’un paramètre obligatoire
|> urlencode(...);

Mais pas de panique ! Pipe accepte n'importe quel type de callable, vous vous rappelez ?

$slug = $title
|> strtolower(...)                  
|> trim(...)                        
|> (fn(string $subject): string => preg_replace('/\s+/', '-', $subject))  // là ça marche : un seul paramètre, une valeur retournée
|> urlencode(...);

Du coup, on a moyen de faire des choses plutôt sympas. Imaginons : on récupère une liste d'images, on veut en extraire celles qui ont un tag spécifique, et compter combien on en a. :br:br
Ça donnerait quelque chose comme ça (on imagine pour l'exemple qu'on récupère forcément toutes les images) :

$count = count(
    array_filter(
        $imageRepository->find(),
        fn(Image $img): bool => $img->hasTag('tag')
    )
);

Avec pipe :

$count = $imageRepository->find()
|> (fn(array $images) => array_filter($images, fn(Image $img): bool => $img->hasTag('tag')))
|> count(...);

Exemple objet / traitement de données

Un dernier exemple pour la route :

$user
|> loadProfile(...)       // charge le profil complet de l’utilisateur
|> enrichProfile(...)     // ajoute des données calculées ou ce que vous voulez
|> json_encode(...);      // transforme le tout en JSON

On va enfin arrêter de voir des imbrications imbuvables !


2. array_first() et array_last()

Ces deux-là, j’ai jamais vraiment compris pourquoi on ne les avait pas eues plus tôt. Jusqu'à maintenant, on était obligé de passer par reset() et end() pour choper le premier ou le dernier élément, mais ça impliquait de modifier le pointeur interne. :br:br
On pouvait aussi jouer avec array_key_first() et array_key_last(), mais c'était assez verbeux.

$last = $array[array_key_last($array)]; // touchait pas au pointeur  
$last = end($array);                    // touchait le pointeur

$first = $array[array_key_first($array)]; // touchait pas au pointeur  
$first = reset($array);                   // touchait le pointeur

Maintenant on a enfin l’équivalent simple à array_key_first() et array_key_last() :

$latest = array_last($notifications);   // le dernier élément  
$oldest = array_first($notifications);  // le premier

En revanche, à savoir : ça renvoie la valeur de l'élément.

$array = ['foo' => 1, 'bar' => 2];  
array_last($array); // renvoie 2  
array_first($array); // renvoie 1

3. Autres ajouts

D'autres ajouts arrivent avec PHP 8.5, moins spectaculaires :

  • Deux nouveaux getters font leur apparition pour aider au debug : get_exception_handler() et get_error_handler(). Rien de spécial à dire de plus ; si vous voulez plus d'infos, vous pouvez consulter la doc PHP Watch .
  • locale_is_right_to_left() : détection des locales "droite à gauche". Peut être pratique pour l'internationalisation. En savoir plus
  • curl_multi_get_handles() : récupère les handles d'un multi-handle. En savoir plus
  • Nouvelle constante PHP_BUILD_DATE : récupère la date de compilation. En savoir plus
  • Nouvelle option pour le CLI php --ini=diff : affiche seulement les directives INI non par défaut. En savoir plus