Passer au contenu principal

Qu’est-ce que le mot-clé yield en PHP ?

En PHP, le mot-clé yield est utilisé pour créer des générateurs.

Un générateur est une fonction qui peut retourner une série de valeurs une par une, sans avoir besoin de stocker toutes les valeurs en mémoire en même temps. Cela permet de gérer efficacement des ensembles de données volumineux.

Syntaxe de base de yield

function generateNumbers() {
    for ($i = 1; $i <= 5; $i++) {
        yield $i;
    }
}

// Utilisation du générateur
foreach (generateNumbers() as $number) {
    echo $number . PHP_EOL;
}

Sortie :

1
2
3
4
5

Explication :

  • Chaque appel à yield retourne une valeur au moment de son exécution.
  • La fonction n’est pas complètement terminée après chaque yield, elle reprend là où elle s’est arrêtée au prochain appel.

Différence entre return et yield

return yield

Termine immédiatement la fonction.

Suspends l’exécution et retourne une valeur temporairement.
Retourne une seule valeur. Retourne une série de valeurs, une à la fois.
Charge toutes les données en mémoire d’un coup. Économise la mémoire en générant des valeurs à la demande.

Quand utiliser yield ?

L’utilisation de yield permet d’éviter une surcharge de la mémoire. Chaque nouvelle ligne remplace la précédente en mémoire, sans accumulation des lignes déjà traitées. Cela rend yield particulièrement efficace pour gérer :

  • Grandes collections de données : Lorsque vous traitez de grandes quantités de données (ex : fichiers volumineux, résultats d’une base de données).
  • Flux de données en streaming : Pour lire des données ligne par ligne depuis un fichier ou une API.

Comment fonctionne yield ?

Exemple : Lecture d’un fichier volumineux

function readLargeFile($filePath) {
    $handle = fopen($filePath, 'r');
    if (!$handle) {
        throw new Exception("Impossible d'ouvrir le fichier.");
    }

    while (($line = fgets($handle)) !== false) {
        yield $line; // Chaque ligne est générée une à la fois
    }

    fclose($handle);
}

// Utilisation
foreach (readLargeFile('largefile.txt') as $line) {
    echo $line; // Une ligne est traitée, puis remplacée par la suivante
}

1️⃣ Appel initial :

  • Lors de l'appel readLargeFile('largefile.txt'), la fonction ne s’exécute pas immédiatement jusqu’à la fin.
  • Un objet générateur Generator est retourné.

2️⃣ Première itération foreach :

  • Le foreach démarre la première itération.
  • Le générateur exécute la fonction jusqu’à rencontrer le premier yield.
  • yield $line retourne la première ligne du fichier.
  • L’état de la fonction (variables, position dans la boucle) est mis en pause.

3️⃣ Deuxième itération :

  • Une fois la première ligne traitée echo $line, le générateur reprend exactement là où il s’était arrêté (juste après le premier yield).
  • La boucle while continue avec le prochain appel à fgets, et la deuxième ligne est lue et retournée via yield.

4️⃣ Itérations suivantes :

  • Ce processus se répète pour chaque ligne jusqu’à ce que fgets renvoie false (fin du fichier).

5️⃣ Fermeture du fichier :

  • Une fois que la boucle while se termine, l’exécution continue après la boucle, et fclose($handle) est exécuté pour fermer proprement le fichier.
  • Le générateur est alors épuisé et le foreach s’arrête.