我們知道在php中,foreach可以很容易地叠代叠代結構(比如數組和對象):
[php]查看純文本
foreach( $array as $elem){
var _ dump($ elem);
}
[php]查看純文本
foreach($ obj as $ key = & gt;$value){
echo " $ key = & gt$value”。PHP _ EOL
}
所以我們想:如果我們foreach壹個實例化的對象會發生什麽?
首先,我們將基本類定義為:
[php]查看純文本
類別測試{
/*壹個公共變量*/
公共$ a;
公共$ b;
/*壹個私有變量*/
私人$ c;
公共函數__construct(){
$ this-& gt;a = " public
$ this-& gt;b = " public
$ this-& gt;c = " private
}
公共函數traverseInside(){
foreach($ this as $ key = & gt;$value){
echo $key。" = >。$價值。EOL
}
}
}
然後我們實例化該類,叠代它,並將其與內部叠代的結果進行比較:
[php]查看純文本
$test =新測試;
回聲" & ltHR >;";
echo "遍歷外部:"。EOL
foreach($ test as $ key = & gt;$value ){
echo $key。" = >。$價值。EOL
}
回聲" & ltHR >;";
echo "遍歷內部:"。EOL
$ test-& gt;traverseInside();
叠代的結果是:
可以看出,外部foreach循環的結果只循環對象的公共屬性,而外部foreach不能循環私有屬性。所以,如果要在外部通過foreach循環出類的所有屬性(public和private),就不能只依賴foreach,必須對類進行“改造”。如何改革班級?如果妳知道foreach的實現(參考laruence的博客:/2008/11/20/630 . html),妳很容易找到對應的方案。另壹方面,在《可重用面向對象軟件設計的設計模式基礎》中也提到,通過將對象的訪問和遍歷從對象中分離出來,放入壹個叠代器對象中,叠代器模式可以以不同的方式遍歷對象。我們暫且不去深究這句話的意思,只要知道對象是可以被叠代器遍歷的。
PHP手冊;部分指出,要實現叠代器模式,需要在叠代器對象中實現以下接口:
[php]查看純文本
abstractpublicmixedcurrent(void)
abstractpublicscalarkey( void)
abstractpublicvidnext(void)
abstractpublicvoidrewind( void)
abstractpublicbooleanvalid(void)
用這個。實現叠代器模式很方便。壹個簡單的例子如下:
[php]查看純文本
類TestIterator實現叠代器{
private $ point = 0;
private $data = array(
“壹”、“二”、“三”,
);
公共函數__construct() {
$ this-& gt;點= 0;
}
函數rewind() {
$ this-& gt;點= 0;
}
函數當前(){
return $ this-& gt;數據[$ this-& gt;點];
}
功能鍵(){
return $ this-& gt;點;
}
函數next() {
++ $ this-& gt;點;
}
函數有效(){
return isset($ this-& gt;數據[$ this-& gt;點]);
}
}
$it =新TestIterator
foreach($ it as $ key = & gt;$value) {
echo $key,$ value
回顯“\ n”;
}
當然,使用叠代器的對象可以通過以下方式進行遍歷:
[php]查看純文本
$it =新TestIterator
$ it-& gt;rewind();
while($ it-& gt;valid()){
$ key = $ it-& gt;key();
$ value = $ it-& gt;當前();
echo " $ key = & gt$ value ";
$ it-& gt;next();
}
最後附上ListIterator在YII的實現(顧名思義,實現List叠代操作的叠代器):
[php]查看純文本
& lt?服務器端編程語言(Professional Hypertext Preprocessor的縮寫)
/**
* CListIterator類文件。
*
* @作者qiang.xue@gmail.com·薛強
* @link /
* @copyright版權?Yii軟件有限責任公司
* @許可證/許可證/
*/
/**
* CListIterator為{@link CList}實現壹個交互器。
*
*它允許CList返回壹個新的叠代器來遍歷列表中的項目。
*
* @作者qiang.xue@gmail.com·薛強
* @版本$Id$
* @包system.collections
* @自1.0
*/
CListIterator類實現叠代器
{
/**
* @var數組要叠代的數據
*/
私人$ _ d;
/**
* @var當前項目的整數索引
*/
私人$ _ I;
/**
* @var數據項的整數計數
*/
私人$ _ c;
/**
*構造函數。
* @param array $data要叠代的數據
*/
公共函數_ _ construct(& amp;$data)
{
$ this-& gt;_ d = & amp$ data
$ this-& gt;_ I = 0;
$ this-& gt;_ c = count($this-& gt;_ d);
}
/**
*倒回內部數組指針。
*接口叠代器需要此方法。
*/
公共函數rewind()
{
$ this-& gt;_ I = 0;
}
/**
*返回當前數組項的鍵。
*接口叠代器需要此方法。
* @return integer當前數組項的鍵
*/
公共功能鍵()
{
return $ this-& gt;_ I;
}
/**
*返回當前數組項。
*接口叠代器需要此方法。
* @return混合了當前數組項
*/
公共函數current()
{
return $ this-& gt;_ d[$ this-& gt;_ I];
}
/**
*將內部指針移動到下壹個數組項。
*接口叠代器需要此方法。
*/
公共函數next()
{
$ this-& gt;_ i++;
}
/**
*返回當前位置是否有項目。
*接口叠代器需要此方法。
* @return布爾值
*/
公共函數有效()
{
return $ this-& gt;_ i & lt$ this-& gt;_ c;
}
}