ホームページ > バックエンド開発 > PHPチュートリアル > SPL に基づいて PHP によって実装されたイテレータ パターン

SPL に基づいて PHP によって実装されたイテレータ パターン

不言
リリース: 2023-03-24 17:18:01
オリジナル
1400 人が閲覧しました

この記事では、主に SPL に基づいて PHP で実装されるイテレーター モードを紹介します。イテレーター モードの概念と原理を簡単に説明し、SPL を使用してイテレーター モードを実装するための関連する操作スキルと注意事項を例の形で分析します。以下を参照してください

この記事の例では、SPL に基づいて PHP によって実装されたイテレータ モードについて説明します。参考までに皆さんと共有してください。詳細は次のとおりです。

これで、部門カテゴリと従業員カテゴリの 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 標準ライブラリによって提供されるイテレータを使用して実装します。

「Dahua デザイン パターン」には次のように書かれています:

イテレーター パターン: イテレーター パターンは、コレクションを走査するための成熟したパターンです。イテレーター パターンの鍵は、コレクションを走査するタスクをイテレーターと呼ばれるオブジェクトに渡すことです。その仕組み シーケンス内のオブジェクトを走査して選択する場合、クライアント プログラマは、コレクション シーケンスの基礎となる構造を知っている必要も、気にする必要もありません。

反復子パターンの機能を簡単に言うと、ループを使用して複雑なデータ構造のすべてのコンポーネントにアクセスできるようにすることです

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

current()、この関数は現在のデータ項目を返します
key()< /code> 、この関数は現在のデータ項目のキーまたはリスト内の項目の位置を返します<br/><code>next() 、この関数はデータ項目のキーまたは位置を前方に移動します
rewind()、この関数はキーの値または位置をリセットします。
valid()、この関数は現在のキーが正しいかどうかを示す bool 値を返します。またはデータ値への位置ポイント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(&#39;LSGO实验室&#39;);
$e1 = new Employee("小锦");
$e2 = new Employee("小猪");
$lsgo->addEmployee($e1);
$lsgo->addEmployee($e2);
echo "LSGO实验室部员情况:";
//这里其实遍历的$_employee
foreach($lsgo as $val){
  echo "部员{$val->getName()}";
}
ログイン後にコピー

附加:

假如现在我们想要知道该部门有几个员工,如果是数组的话,一个 count()

実装 Iterator インターフェースと指定されたメソッドを使用すると、PHP はこのクラス型のオブジェクトを反復する必要があることを認識できます。

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

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

追加:

部門の従業員数を知りたい場合、それが配列の場合、count() 関数は問題ないので、上記のようにオブジェクトを配列として扱うことができますか? Countable インターフェイスは、SPL 標準ライブラリで使用できるように提供されています:

rrreee

この記事は、「PHP の高度なテクニック、オブジェクト指向、およびコア テクノロジの深い理解」について参照しています

関連する推奨事項:

PHP SPL アプリケーションの簡単な分析

🎜PHP が phpqrcode クラスに基づいて QR コードを生成する方法の詳細な説明🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜

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

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート