ホームページ  >  記事  >  バックエンド開発  >  SPL に基づいて PHP で実装されたイテレータ ステップの詳細な説明

SPL に基づいて PHP で実装されたイテレータ ステップの詳細な説明

php中世界最好的语言
php中世界最好的语言オリジナル
2018-05-16 15:04:161371ブラウズ

今回は、SPLに基づいてPHPに実装されるイテレータの手順について詳しく説明します。SPLに基づいてPHPに実装されるイテレータの注意点は何ですか?以下は実際のケースです。 これで、Department クラスと Employee クラスの 2 つのクラスができました。

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

さて、LSGO 研究室には 2 人のメンバーがいます。次に、ループを使用してすべてのメンバーをリストし、各従業員の詳細を取得したいと思います。部門。

ここでは、PHP の SPL 標準ライブラリによって提供されるイテレータを使用して実装します。

「Big Talk

デザイン パターン

」には次のように書かれています:

イテレータ パターン

: イテレータ パターンは、コレクションを走査するための成熟したパターンです。イテレータ パターンの鍵は、コレクションを走査するタスクをオブジェクトに渡すことです。イテレータと呼ばれるオブジェクトであり、クライアント プログラマがコレクション シーケンスの基礎となる構造を知ったり気にしたりすることなく、シーケンス内のオブジェクトを走査して選択することによって機能します。 反復子パターンの役割を簡単に言うと、ループを使用して複雑なデータ構造のすべてのコンポーネントにアクセスできるようになります

オブジェクトが反復を実装したい場合は、このクラスに反復子 (SPL 標準ライブラリによって提供される) を実装させます。このインターフェイスを実装するには、次のメソッドを実装する必要があります:

current()、この関数は現在のデータ項目を返します

key() , この関数は、現在のデータ項目のキーまたはリスト内の項目の位置を返します

next()。この関数は、データ項目のキーまたは位置を前方に移動しますcurrent(),该函数返回当前数据项
key(),该函数返回当前数据项的键或者该项在列表中的位置
next(),该函数使数据项的键或者位置前移
rewind(),该函数重置键值或者位置
valid(),该函数返回 bool 值,表明当前键或者位置是否指向数据值

实现了 Iterator 接口和规定的方法后,PHP就能够知道该类类型的对象需要迭代。

我们使用这种方式重构 Department 类:

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

附加:

假如现在我们想要知道该部门有几个员工,如果是数组的话,一个 count()rewind( )。この関数は、キーの値または位置

valid() をリセットします。この関数は、実装後に現在のキーまたは位置がデータ値を指すかどうかを示します。 Iterator インターフェイスと指定されたメソッドにより、PHP はこのタイプのオブジェクトに反復が必要であることを知ることができます。

Department クラスを次の方法でリファクタリングします。

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

追加:

部門の従業員数を知りたい場合、配列の場合は count( ) 関数は問題ないので、オブジェクトを上記のように配列として扱うことができますか? SPL 標準ライブラリは、私たちが使用できる Countable インターフェイスを提供します: rrreee
この記事の事例を読んだ後は、この方法を習得したと思います。さらに興味深い情報については、PHP 中国語 Web サイトの他の関連記事に注目してください。

推奨書籍:
php7 で MongoDB を追加、削除、変更、クエリする手順の詳細な説明

🎜🎜🎜🎜 PHP ファクトリ メソッドの設計パターンのケースの詳細な説明 🎜🎜🎜

以上がSPL に基づいて PHP で実装されたイテレータ ステップの詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。