イテレータパターンとそのphp実装(Yiiフレームワーク)

伊谢尔伦
リリース: 2023-03-02 18:52:01
オリジナル
1234 人が閲覧しました

イテレータ パターンは動作パターンであり、最も単純で最も一般的な設計パターンです。これにより、ユーザーは実際の基礎となる操作を知らなくても、特定のインターフェイスを通じてコン​​テナー内の各要素を検査できます。

適用性

PHPのforeach関数などのカスタム構造を容易にするために言語自体のトラバーサル関数を使用したい場合

クラス図

イテレータパターンとそのphp実装(Yiiフレームワーク)

PHPインスタンス

<?php
class sample implements Iterator {
   private $_items ;

   public function __construct(&$data) {
       $this->_items = $data;
   }
   public function current() {
       return current($this->_items);
   }

   public function next() {
       next($this->_items);   
   }

   public function key() {
       return key($this->_items);
   }

   public function rewind() {
       reset($this->_items);
   }

   public function valid() {                                                                              
       return ($this->current() !== FALSE);
   }
}

// client
$data = array(1, 2, 3, 4, 5);
$sa = new sample($data);
foreach ($sa AS $key => $row) {
   echo $key, &#39; &#39;, $row, &#39;<br />&#39;;
}
?>
ログイン後にコピー

Yiiフレームワークでの実装:

Yii フレームワークでは、コレクションディレクトリの CMapIterator.php ファイルでそのイテレータの実装が次のようになります:

class CMapIterator implements Iterator {
/**
* @var array the data to be iterated through
*/
    private $_d;
/**
* @var array list of keys in the map
*/
    private $_keys;
/**
* @var mixed current key
*/
    private $_key;
 
/**
* Constructor.
* @param array the data to be iterated through
*/
    public function __construct(&$data) {
        $this->_d=&$data;
        $this->_keys=array_keys($data);
    }
 
/**
* Rewinds internal array pointer.
* This method is required by the interface Iterator.
*/
    public function rewind() {                                                                                 
        $this->_key=reset($this->_keys);
    }
 
/**
* Returns the key of the current array element.
* This method is required by the interface Iterator.
* @return mixed the key of the current array element
*/
    public function key() {
        return $this->_key;
    }
 
/**
* Returns the current array element.
* This method is required by the interface Iterator.
* @return mixed the current array element
*/
    public function current() {
        return $this->_d[$this->_key];
    }
 
/**
* Moves the internal pointer to the next array element.
* This method is required by the interface Iterator.
*/
    public function next() {
        $this->_key=next($this->_keys);
    }
 
/**
* Returns whether there is an element at current position.
* This method is required by the interface Iterator.
* @return boolean
*/
    public function valid() {
        return $this->_key!==false;
    }
}
 
$data = array(&#39;s1&#39; => 11, &#39;s2&#39; => 22, &#39;s3&#39; => 33);
$it = new CMapIterator($data);
foreach ($it as $row) {
    echo $row, &#39;<br />&#39;;
}
ログイン後にコピー

前の単純な実装と比較して、その位置の変更は制御によって行われます。この実装の目的は、配列値として false が使用された場合に反復できなくなることを回避することです。


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