Maison  >  Article  >  développement back-end  >  Fonctionnalités avancées PHP : les merveilleuses utilisations des générateurs et des itérateurs

Fonctionnalités avancées PHP : les merveilleuses utilisations des générateurs et des itérateurs

WBOY
WBOYoriginal
2024-06-01 20:44:00976parcourir

Réponse : les générateurs et les itérateurs sont des fonctions et des objets spéciaux qui peuvent générer des valeurs une par une sans stocker l'intégralité de l'ensemble de données. Générateur : génère une série de valeurs, une valeur pour chaque appel ; Itérateur : fournit une méthode pour accéder aux éléments de la collection et génère un élément lors du parcours ; Combat pratique : utilisé pour la pagination, générant des ensembles de données page par page, sans stocker l'intégralité des données. mis en mémoire.

Fonctionnalités avancées PHP : les merveilleuses utilisations des générateurs et des itérateurs

Fonctionnalités avancées PHP : L'utilisation magique des générateurs et des itérateurs

Générateur

Un générateur est une fonction spéciale utilisée pour générer une série de valeurs. Contrairement aux fonctions classiques, les générateurs peuvent produire une valeur à chaque appel sans stocker l'intégralité du tableau de valeurs en mémoire.

function numbersGenerator() {
  for ($i = 1; $i <= 10; $i++) {
    yield $i;
  }
}

foreach (numbersGenerator() as $number) {
  echo $number . "\n";
}

Itérateur

Un itérateur est un objet qui fournit un moyen d'accéder aux éléments d'une collection. Comme les générateurs, les itérateurs peuvent générer un élément tout en parcourant une collection sans stocker l’intégralité de la collection en mémoire.

class NumberIterator implements Iterator {
  private $start;
  private $end;
  private $current;

  public function __construct($start, $end) {
    $this->start = $start;
    $this->end = $end;
    $this->current = $start;
  }

  public function rewind() {
    $this->current = $this->start;
  }

  public function current() {
    return $this->current;
  }

  public function key() {
    return $this->current;
  }

  public function next() {
    $this->current++;
  }

  public function valid() {
    return $this->current <= $this->end;
  }
}

$iterator = new NumberIterator(1, 10);

foreach ($iterator as $number) {
  echo $number . "\n";
}

Cas pratique : Paginator

Les générateurs et itérateurs sont très adaptés aux scénarios de pagination. En utilisant des générateurs ou des itérateurs, nous pouvons générer l'ensemble de données page par page sans stocker l'intégralité de l'ensemble de données en mémoire.

function paginate($query, $pageSize) {
  $page = 1;

  while (true) {
    $offset = ($page - 1) * $pageSize;
    $results = $query->offset($offset)->limit($pageSize)->execute();

    if (count($results) === 0) {
      break;
    }

    yield $results;
    $page++;
  }
}

foreach (paginate($query, 10) as $page) {
  echo "Page $page\n";
  foreach ($page as $result) {
    // Process the result
  }
}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn