Heim  >  Artikel  >  Backend-Entwicklung  >  Einführung in Design Patterns-Iterator Pattern (PHP-Version)

Einführung in Design Patterns-Iterator Pattern (PHP-Version)

WBOY
WBOYOriginal
2016-08-08 09:27:08839Durchsuche

Bevor wir uns mit diesem Entwurfsmuster befassen, werfen wir zunächst einen Blick auf eine Interviewfrage aus dem Blog von Bruder Niao:

Die Frage lautet wie folgt:

Ermöglichen Sie, dass das Objekt bearbeitet wird Erfordert wie eine Array-Schleife, dass die Eigenschaft privat sein muss.

Es ist schwierig, es ohne Verwendung des Iteratormusters zu implementieren. Schauen wir uns zunächst den Implementierungscode an:

sample.php

<?php
class Sample implements Iterator{
	private $_arr;
	
	public function __construct(Array $arr){
		$this->_arr = $arr;
	}
	
	public function current(){
	    return current($this->_arr);
	}
	
	public function next(){
	     return next($this->_arr);
	}
	
	public function key(){
	     return key($this->_arr);
	}
	
	public function valid(){
	     return $this->current() !== false;
	}
	
	public function rewind(){
	   reset($this->_arr);
	}
}

index.php
<?php
require &#39;Sample.php&#39;;

$arr = new Sample([&#39;max&#39;, &#39;ben&#39;, &#39;will&#39;]); 

foreach ($arr as $k=>$v){
    echo $k."-".$v."<br />";
}

Die Iterator-Schnittstelle stammt aus der spl-Klassenbibliothek von PHP. Nachdem ich die relevanten Artikel zu Entwurfsmustern geschrieben habe, werde ich diese Klassenbibliothek weiter studieren.

Außerdem habe ich im Internet einen Implementierungscode zum Iteratormuster im Yii-Framework gefunden:

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('s1' => 11, 's2' => 22, 's3' => 33);
$it = new CMapIterator($data);
foreach ($it as $row) {
    echo $row, '<br />';
}

Die offizielle Definition des Iterator-Entwurfsmusters lautet: Verwenden Sie das Iteratormuster, um einen einheitlichen Zugriff auf Aggregatobjekte bereitzustellen, dh einen externen Iterator für den Zugriff auf und das Durchlaufen von Aggregatobjekten bereitzustellen, ohne die interne Struktur des Objekts offenzulegen. Wird auch Cursor-Modus genannt.

Nun, ich verstehe es nicht ganz. Warum müssen wir immer noch einen solchen Iteratormodus verwenden, um ihn zu implementieren, wenn es offensichtlich ist, dass Arrays mit foreach durchlaufen werden können? Wir können nur auf die Vertiefung der Arbeitserfahrung warten, um es besser zu verstehen.

Referenzdokumente:

http://www.cnblogs.com/davidhhuan/p/4248206.html

http://blog.csdn.net /hguisu/article/details/7552841

http://www.phppan.com/2010/04/php-iterator-and-yii-cmapiterator/

Hinweise zum Lesen des PHP-Quellcodes 24: Analyse der Gründe, warum die Iteration nicht abgeschlossen werden kann, wenn der Wert in der Iterator-Implementierung falsch ist: http://www.phppan.com/2010/04/php-source-24-iterator-false-value /


Das Obige stellt eine Einführung in Designmuster – Iteratormuster (PHP-Version) vor, einschließlich Aspekten des Inhalts. Ich hoffe, dass es für Freunde hilfreich sein wird, die sich für PHP-Tutorials interessieren.

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:openwrt five: PHP-ServerNächster Artikel:openwrt five: PHP-Server