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 à
yieldretourne 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
Generatorest retourné.
2️⃣ Première itération foreach :
- Le
foreachdémarre la première itération. - Le générateur exécute la fonction jusqu’à rencontrer le premier
yield. yield $lineretourne 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 premieryield). - La boucle
whilecontinue avec le prochain appel àfgets, et la deuxième ligne est lue et retournée viayield.
4️⃣ Itérations suivantes :
- Ce processus se répète pour chaque ligne jusqu’à ce que
fgetsrenvoiefalse(fin du fichier).
5️⃣ Fermeture du fichier :
- Une fois que la boucle
whilese termine, l’exécution continue après la boucle, etfclose($handle)est exécuté pour fermer proprement le fichier. - Le générateur est alors épuisé et le
foreachs’arrête.