Maison  >  Article  >  développement back-end  >  Explication détaillée des étapes de l'itérateur implémentées en PHP basée sur SPL

Explication détaillée des étapes de l'itérateur implémentées en PHP basée sur SPL

php中世界最好的语言
php中世界最好的语言original
2018-05-16 15:04:161345parcourir

Cette fois, je vais vous apporter une explication détaillée des étapes des itérateurs implémentés en PHP basés sur SPL. Quelles sont les précautions pour les itérateurs implémentés en PHP basés sur SPL. Ce qui suit est un cas pratique, jetons un coup d'oeil.

Maintenant, il y a deux catégories, la catégorie Département et la catégorie Employé :

//部门类
class Department{
  private $_name;
  private $_employees;
  function construct($name){
    $this->_name = $name;
    $this->employees = array();
  }
  function addEmployee(Employee $e){
    $this->_employees[] = $e;
    echo "员工{$e->getName()}被分配到{$this->_name}中去";
  }
}
//员工类
class Employee{
  private $_name;
  function construct($name){
    $this->_name = $name;
  }
  function getName(){
    return $this->_name;
  }
}
//应用:
$lsgo = new Department('LSGO实验室');
$e1 = new Employee("小锦");
$e2 = new Employee("小猪");
$lsgo->addEmployee($e1);
$lsgo->addEmployee($e2);

D'accord, maintenant il y a deux membres dans le laboratoire LSGO, et maintenant je veux lister tous les membres du département, c'est-à-dire, utilisez une boucle pour obtenir les détails de chaque employé du service.

Ici, nous utilisons l'itérateur fourni par la bibliothèque standard SPL en PHP pour l'implémenter.

"Big Talk Design Patterns " dit ceci :

Modèle d'itérateur  : Le modèle d'itérateur est un modèle mature pour parcourir les collections. La clé est de confier la tâche de parcourir la collection à un objet appelé itérateur, qui fonctionne en parcourant et en sélectionnant des objets dans la séquence, sans que le programmeur client ait à connaître ou à se soucier de la structure sous-jacente de la séquence de collection.

La fonction du modèle itérateur en bref est de permettre d'accéder à tous les composants de structures de données complexes à l'aide de boucles

Si notre objet veut implémenter l'itération, nous faisons en sorte que cette classe implémente Iterator (à condition par la bibliothèque standard SPL), il s'agit d'une interface itératrice Afin d'implémenter cette interface, nous devons implémenter la méthode suivante :

current(), cette fonction renvoie la donnée courante
key(). , cette fonction Renvoie la clé de l'élément de données actuel ou la position de l'élément dans la liste
next() Cette fonction déplace la clé ou la position de l'élément de données vers l'avant
rewind(). valeur de clé ou position
valid(), cette fonction renvoie une valeur booléenne, indiquant si la clé ou la position actuelle pointe vers la valeur de données

Après avoir implémenté l'interface Iterator et les méthodes spécifiées, PHP peut savoir que les objets de ce type doivent être itérés.

Nous refactorisons la classe Department de cette manière :

class Department implements Iterator
{
  private $_name;
  private $_employees;
  private $_position;//标志当前数组指针位置
  function construct($name)
  {
    $this->_name = $name;
    $this->employees = array();
    $this->_position = 0;
  }
  function addEmployee(Employee $e)
  {
    $this->_employees[] = $e;
    echo "员工{$e->getName()}被分配到{$this->_name}中去";
  }
  //实现 Iterator 接口要求实现的方法
  function current()
  {
    return $this->_employees[$this->_position];
  }
  function key()
  {
    return $this->_position;
  }
  function next()
  {
    $this->_position++;
  }
  function rewind()
  {
    $this->_position = 0;
  }
  function valid()
  {
    return isset($this->_employees[$this->_position]);
  }
}
//Employee 类同前
//应用:
$lsgo = new Department('LSGO实验室');
$e1 = new Employee("小锦");
$e2 = new Employee("小猪");
$lsgo->addEmployee($e1);
$lsgo->addEmployee($e2);
echo "LSGO实验室部员情况:";
//这里其实遍历的$_employee
foreach($lsgo as $val){
  echo "部员{$val->getName()}";
}

Supplémentaire :

Supposons que maintenant nous voulions savoir combien il y en a dans cette classe Employés du département, s'il s'agit d'un tableau, une fonction count() est ok, alors pouvons-nous traiter l'objet comme un tableau comme ci-dessus ? La bibliothèque standard SPL fournit l'interface Countable que nous pouvons utiliser :

class Department implements Iterator,Countable{
  //前面同上
  //实现Countable中要求实现的方法
  function count(){
    return count($this->_employees);
  }
}
//应用:
echo "员工数量:";
echo count($lsgo);

Je pense que vous maîtrisez la méthode après avoir lu le cas dans cet article. Pour des informations plus intéressantes, veuillez prêter attention aux autres articles connexes sur. le site PHP chinois !

Lecture recommandée :

Explication détaillée des étapes d'ajout, de suppression, de modification et d'interrogation de MongoDB en php7

Détaillé explication du cas du modèle de conception de la méthode d'usine PHP

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