Home >Backend Development >PHP Tutorial >Iterator pattern implemented by PHP based on SPL

Iterator pattern implemented by PHP based on SPL

不言
不言Original
2018-04-23 11:49:201407browse

This article mainly introduces the iterator mode implemented by PHP based on SPL, briefly describes the concept and principle of the iterator mode, and analyzes the relevant operating skills and precautions for using SPL to implement the iterator mode in PHP in the form of examples. It is required Friends can refer to

This article describes the iterator mode implemented by PHP based on SPL. Share it with everyone for your reference, the details are as follows:

There are now two categories, Department category and Employee 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 department members in the LSGO laboratory. Now I want to list all the department members, which is to use a loop to get the details of each employee in the department.

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

"Dahua Design Patterns" says this:

Iterator pattern: The iterator pattern is a mature pattern for traversing collections. The key to the iterator pattern is to hand over the task of traversing the collection to a program called An iterator object that works by traversing and selecting objects in a 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 value

After 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 will be ok. So can we treat the object as an array like above? The Countable interface is provided in the SPL standard library for us to use:

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

This article refers to "In-depth understanding of PHP advanced techniques, object-oriented and core technologies"

Related recommendations:

A brief analysis of PHP SPL application

Detailed explanation of how PHP generates QR codes based on the phpqrcode class

The above is the detailed content of Iterator pattern implemented by 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