當前位置:編程學習大全網 - 源碼下載 - PHP中用什麽來遍歷對象?

PHP中用什麽來遍歷對象?

其實百度壹下就知道了。

我們知道在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;

}

}

  • 上一篇:php壹般用什麽開發工具
  • 下一篇:mingw內聯匯編傳參瞎傳
  • copyright 2024編程學習大全網