downloads | documentation | faq | getting help | mailing lists | licenses | wiki | reporting bugs | php.net sites | conferences | my php.net

search for in the

Generator syntax> <Generators
[edit] Last updated: Fri, 17 May 2013

view this page in

Résumé sur les générateurs

(PHP 5 >= 5.5.0)

Les générateurs fournissent une façon simple d'implémenter des itérateurs sans le coût, ni la complexité d'implémenter une classe qui implémente l'interface Iterator.

Un générateur vous permet d'écrire du code qui utilise foreach pour parcourir un jeu de données, sans avoir à construire un tableau en mémoire pouvant conduire à la limite de la mémoire, ou nécessiter du temps de génération. Au lieu de cela, vous pouvez écrire une fonction générateur, qui est identique à une fonction normale, excepté le fait qu'au lieu de faire un seul retour, un générateur peut yield autant de fois que nécessaire afin de fournir les valeurs à parcourir.

Un exemple simple de ce mécanisme est la ré-implémentation de la fonction range() sous la forme d'un générateur. La fonction standard range() doit générer un tableau avec chaque valeur le contenant, et le retourner, ce qui peut conduire en la génération de gros tableaux : par exemple, l'appel du code range(0, 1000000) peut consommer plus de 100 Mo de mémoire.

Comme alternative, nous pouvons implémenter un générateur xrange(), qui n'aura en besoin mémoire que la seule création d'un objet Iterator, et surveiller le statut courant interne du génération, ce qui revient à une consommation mémoire inférieure à 1 Ko.

Exemple #1 Implémentation de la fonction range() sous la forme d'un générateur

<?php
function xrange($start$limit$step 1) {
    if (
$start $limit) {
        if (
$step <= 0) {
            throw new 
LogicException('Step must be +ve');
        }

        for (
$i $start$i <= $limit$i += $step) {
            
yield $i;
        }
    } else {
        if (
$step >= 0) {
            throw new 
LogicException('Step must be -ve');
        }

        for (
$i $start$i >= $limit$i += $step) {
            
yield $i;
        }
    }
}

/* Note que les fonctions range() et xrange() produisent le
 * même affichage. */

echo 'Chiffre paire simple depuis range():  ';
foreach (
range(192) as $number) {
    echo 
"$number ";
}
echo 
"\n";

echo 
'Chiffre paire simple depuis xrange(): ';
foreach (
xrange(192) as $number) {
    echo 
"$number ";
}
?>

L'exemple ci-dessus va afficher :

Chiffre paire simple depuis range():  1 3 5 7 9 
Chiffre paire simple depuis xrange(): 1 3 5 7 9 


add a note add a note User Contributed Notes Résumé sur les générateurs - [0 notes]
There are no user contributed notes for this page.

 
show source | credits | stats | sitemap | contact | advertising | mirror sites