Maison >développement back-end >tutoriel php >Analyse des itérateurs et générateurs en PHP et introduction à leurs avantages et inconvénients

Analyse des itérateurs et générateurs en PHP et introduction à leurs avantages et inconvénients

不言
不言original
2018-08-11 16:57:562662parcourir

Ce que cet article vous apporte, c'est l'analyse et l'introduction des avantages et des inconvénients des itérateurs et des générateurs en PHP. J'espère qu'il aura une certaine valeur de référence. t'aider.

1. Itérateur

Analyse : Pensez-y, si vous mettez l'objet de collection et les opérations sur le Objet de collection Ensemble, lorsque nous voulons parcourir les éléments de l'objet de collection d'une autre manière, nous devons modifier l'objet de collection, ce qui viole le « principe de responsabilité unique », et le modèle d'itérateur sépare la structure des données et l'algorithme des données. structure, et les deux peuvent être développés indépendamment.

Avantages :

1. Prend en charge plusieurs méthodes de traversée. Par exemple, dans une liste ordonnée, nous fournissons deux itérateurs pour le parcours direct et le parcours inverse selon les besoins. Les utilisateurs n'ont besoin que de demander à notre itérateur d'effectuer des opérations de parcours sur la collection

2. Classes d'agrégation simplifiées. En raison de l'introduction des itérateurs, l'objet de collection d'origine n'a pas besoin de parcourir les éléments de collection par lui-même

3. Il est très pratique d'ajouter de nouvelles classes d'agrégation et classes d'itérateur, et les deux dimensions peuvent être modifiées indépendamment.

4. Fournir une interface unifiée pour différentes structures de collection, prenant ainsi en charge le même algorithme pour fonctionner sur différentes structures de collection

Inconvénients :

1. Itération Le modèle d'itérateur sépare les responsabilités de stockage des données et de parcours des données. Lors de l'ajout d'un nouvel objet de collection, vous devez ajouter une classe d'itérateur correspondante. Le nombre de classes augmente par paires, ce qui augmente la complexité du système dans une certaine mesure

.

Interface spécifique :

Iterator extends Traversable {
/* 方法 */
abstract public mixed current ( void )
abstract public scalar key ( void )
abstract public void next ( void )
abstract public void rewind ( void )
abstract public bool valid ( void )
}

2. Générateur

Le générateur PHP (générateur) est une fonction introduite dans PHP5.5.0 différente des itérateurs PHP standards, Les classes du générateur PHP ne sont pas nécessaires pour implémenter l'interface Iterator, réduisant ainsi la charge sur la classe. Le générateur calculera et affichera les valeurs à itérer en fonction des exigences, ce qui a un impact significatif sur les performances. Imaginez s'il s'agissait d'itérateurs PHP standard. effectuer souvent des opérations d'itération en mémoire Si l'opérateur doit calculer l'ensemble de données à l'avance, les performances seront faibles ; si une méthode spécifique est utilisée pour calculer une grande quantité de données, l'impact sur les performances sera encore plus important ; À ce stade, nous pouvons utiliser le générateur pour calculer et générer instantanément les valeurs suivantes sans occuper de précieuses ressources mémoire.

Avantages : prend moins de mémoire et a de bonnes performances. L'état interne du générateur est mis en pause chaque fois qu'il produit une valeur ; il est restauré lorsque le générateur demande la valeur suivante. Les composants internes du générateur continuent de basculer entre pause et reprise jusqu'à ce que la boucle soit terminée ou jusqu'à la position pause

Inconvénients :

1 Le générateur PHP ne peut pas satisfaire les besoins de tous les itérateurs, car s'il le fait. n'est pas interrogé, le générateur ne sait jamais quelle est la prochaine valeur sur laquelle itérer, il n'y a aucun moyen de reculer ou d'avancer dans le générateur.

2. Le générateur est toujours unique et le même générateur ne peut pas être itéré plusieurs fois. Cependant, le générateur peut être reconstruit ou cloné si nécessaire.

Créer un générateur :

1 Le générateur étant une fonction PHP, le générateur utilise le mot-clé rendement dans la fonction. Contrairement aux fonctions PHP ordinaires, les producteurs ne renvoient jamais de valeurs, ils produisent uniquement des valeurs.

<?php
function myGenerator(){
    yield &#39;a&#39;;
    yield &#39;b&#39;;
    yield &#39;c&#39;;
}

2. Lors de l'appel de la fonction générateur, PHP renverra un objet appartenant à la classe Generator. Cet objet peut être itéré à l'aide de la fonction foreach(). Pour chaque itération, PHP demandera à l'instance Generator de calculer et de fournir la prochaine valeur à itérer

<?php
function makeRange($length){
    for($i = 0; $i<$length; $i++){
        yield $i;
    }
}

foreach(makeRange(1000000) as $i){
    echo $i,PHP_EOL;
}

Comme indiqué ci-dessus : Lorsque $length est grand (millions) et que vous n'utilisez pas de générateur à la fois en même temps Si tel est le cas, la mémoire doit être allouée à l'avance pour un tableau composé de un million à mille cinq entiers. Le générateur PHP peut réaliser la même opération, mais il n'allouera de la mémoire que pour un entier à la fois

Recommandations associées :

php utilise des opérations sur bits pour implémenter l'addition, la soustraction, la multiplication et division d'entiers et test (exemple de code)

Code pour une interaction simple entre PHP et formulaire html

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