PHP 8.1 : utilisation de la syntaxe d'appel de première classe pour créer une fonction de rappel

Publié le 02/10/2022 • Actualisé le 02/10/2022


English language detected! 🇬🇧

  We noticed that your browser is using English. Do you want to read this post in this language?

Read the english version 🇬🇧 Close

Dans ce bout de code, nous voyons comment utiliser la syntaxe d'appel de première classe pour créer une fonction de rappel ; elle a été introduite dans PHP 8.1. Créer une fonction de rappel n'a jamais été la chose la plus intuitive avec PHP. Cette nouvelle fonctionnalité essaie de remédier à cela. À la place d'utiliser des tableaux et des chaînes, on peut désormais utiliser des fonctions et appels comme nous le ferions d'habitude dans le contexte courant dans lequel la fonction de rappel est requise. Ce qui diffère est l'utilisation de l'opérateur de décompactage ... à la place d'éventuels arguments. Cela permet aussi à l'analyse statique de faire correctement son travail et détecter d'éventuelles erreurs. Et, évidemment, dans le code suivant, si l'on se trompe dans le nom de la fonction, votre IDE va tout de suite le détecter, avant même que l'analyse statique ne le fasse.
Haha, c'est une note marrante que l'on trouve dans la documentation PHP : Les ... font partie de la syntaxe et ne sont pas une omission. 😁


<?php

declare(strict_types=1);

namespace App\Controller\Snippet;

/**
 * J'utilise un trait PHP afin d'isoler chaque snippet dans un fichier.
 * Ce code doit être apellé d'un contrôleur Symfony étendant AbstractController (depuis Symfony 4.2)
 * ou Symfony\Bundle\FrameworkBundle\Controller\Controller (Symfony <= 4.1).
 * Les services sont injectés dans le constructeur du contrôleur principal.
 */
trait Snippet221Trait
{
    public function snippet221(): void
    {
        $array = [
            'a',
            'bb',
            'ccc',
            'dddd',
        ];
        print_r($array);

        $array = array_map($this->callbackForSnippet221(...), $array);
        print_r($array);

        // before il was array_map('strlen',
        $array = array_map(strlen(...), $array);
        print_r($array);

        // That's it! 😁
    }

    public function callbackForSnippet221(string $element): string
    {
        return $element.' ('.\strlen($element).')';
    }
}

 Exécuter le snippet  Plus sur Stackoverflow   Lire la doc  Plus sur le web  Snippet aléatoire

  Travaillez avec moi !