Home  >  Article  >  Backend Development  >  Detailed explanation of iterator steps implemented in PHP based on SPL

Detailed explanation of iterator steps implemented in PHP based on SPL

php中世界最好的语言
php中世界最好的语言Original
2018-05-16 15:04:161353browse

This time I will bring you a detailed explanation of the steps of iterators implemented in PHP based on SPL. What are the iterators implemented in PHP based on SPL? Now there are two categories, Department category and Employee category:

//部门类
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);

Okay, now there are two members in the LSGO laboratory, and now I want to List all employees, that is, use a loop to obtain the details of each employee in the department.

Here we use the iterator provided by the SPL standard library in PHP to implement.

"Big Talk

Design Pattern

" says this:

Iterator pattern

: The iterator pattern is a mature pattern for traversing collections. The iterator pattern The key is to hand over the task of traversing the collection to an object called an iterator, which works by traversing and selecting objects in the sequence, without the client programmer having to know or care about the underlying structure of the collection sequence. The function of the iterator pattern in short is to enable all components of complex data structures to be accessed using loops

If our object wants to implement iteration, we make this class implement Iterator (Provided by the SPL standard library), this is an iterator interface. In order to implement this interface, we must implement the following method:

current()

, this function returns the current data item key()
, this function returns the key of the current data item or the position of the item in the list next()
, this function moves the key or position of the data item forward rewind()
, this function resets the key value or position valid()
, this function returns a bool value, indicating whether the current key or position points to the data valueAfter implementing the Iterator interface and the specified methods, PHP will be able to know that objects of this type need to be iterated.

We refactor the Department class in this way:

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()}";
}

Additional:

If now we want to know how many employees there are in this department, If it is an array, a

count()

function is ok, so can we treat the object as an array as above? The SPL standard library provides the Countable interface for us to use: <pre class="brush:php;toolbar:false;">class Department implements Iterator,Countable{ //前面同上 //实现Countable中要求实现的方法 function count(){ return count($this-&gt;_employees); } } //应用: echo &quot;员工数量:&quot;; echo count($lsgo);</pre> I believe you have mastered the method after reading the case in this article. For more exciting information, please pay attention to other related articles on the PHP Chinese website!

Recommended reading:

php7 Detailed explanation of the steps to add, delete, modify and query MongoDB


Detailed explanation of PHP factory method design pattern case

The above is the detailed content of Detailed explanation of iterator steps implemented in PHP based on SPL. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn