この記事では、主に 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('LSGO实验室'); $e1 = new Employee("小锦"); $e2 = new Employee("小猪"); $lsgo->addEmployee($e1); $lsgo->addEmployee($e2); echo "LSGO实验室部员情况:"; //这里其实遍历的$_employee foreach($lsgo as $val){ echo "部员{$val->getName()}"; }
附加:
假如现在我们想要知道该部门有几个员工,如果是数组的话,一个 count()
class Department implements Iterator,Countable{ //前面同上 //实现Countable中要求实现的方法 function count(){ return count($this->_employees); } } //应用: echo "员工数量:"; echo count($lsgo);
PHP SPL アプリケーションの簡単な分析
🎜PHP が phpqrcode クラスに基づいて QR コードを生成する方法の詳細な説明🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜以上がSPL に基づいて PHP によって実装されたイテレータ パターンの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。