php mysql迭代器_php 迭代器
迭代器(Iterator)模式,又叫做游標(biāo)(Cursor)模式。GOF給出的定義為:提供一種方法訪問(wèn)一個(gè)容器(container)對(duì)象中各個(gè)元素,而又不需暴露該對(duì)象的內(nèi)部細(xì)節(jié)。
百度百科:?http://baike.baidu.com/view/9791023.htm?fr=aladdin
解釋
上面這名話可能多數(shù)人看得似懂非懂,什么叫做訪問(wèn)容器的各個(gè)元素,又不暴露對(duì)象的內(nèi)部細(xì)節(jié)呢?尤其是網(wǎng)上很多例子都過(guò)于簡(jiǎn)單,直接扔一個(gè)數(shù)組,然后去實(shí)現(xiàn)了迭代器的各種方法,如下:
class SomeCollection implements Iterator
{
protected $_data;
protected $_pos;
function __construct($data)
{
$this->_data = $data;
$this->_pos = 0;
}
function current()
{
$row = $this->_data[$this->_pos];
return $row;
}
function next()
{
$this->_pos++;
}
function valid()
{
return $this->_pos >= 0 && $this->_pos _data);
}
function key()
{
return $this->_pos;
}
function rewind()
{
$this->_pos = 0;
}
}
$array = array(
array('url' => 'www.zeroplace.cn'),
array('url' => 'www.baidu.com'),
array('url' => 'www.sina.com.cn'),
array('url' => 'www.google.com'),
array('url' => 'www.qq.com'),
);
$coll = new SomeCollection($array);
foreach ($coll as $row) {
echo $row['url'], "\n";
}
這樣的例子就不能夠說(shuō)明迭代器的作用,因?yàn)樗荒苷f(shuō)明迭代器隱藏了內(nèi)部的數(shù)據(jù)結(jié)構(gòu),傳進(jìn)去的和返回出來(lái)的完全是一樣的數(shù)據(jù)。
迭代器怎么用
我只能說(shuō)在不同的場(chǎng)合有不同的用法。比如我把上面的例子修改一下,可能就可以說(shuō)明迭代器可以隱藏?cái)?shù)據(jù)結(jié)構(gòu)這個(gè)特性了。請(qǐng)看如下代碼。
class SomeCollection implements Iterator
{
protected $_data;
protected $_pos;
function __construct($data)
{
$this->_data = $data;
$this->_pos = 0;
}
function current()
{
$row = $this->_data[$this->_pos];
$row['ip'] = gethostbyname($row['url']);
return $row;
}
function next()
{
$this->_pos++;
}
function valid()
{
return $this->_pos >= 0 && $this->_pos _data);
}
function key()
{
return $this->_pos;
}
function rewind()
{
$this->_pos = 0;
}
}
$array = array(
array('url' => 'www.zeroplace.cn'),
array('url' => 'www.baidu.com'),
array('url' => 'www.sina.com.cn'),
array('url' => 'www.google.com'),
array('url' => 'www.qq.com'),
);
$coll = new SomeCollection($array);
foreach ($coll as $row) {
echo $row['url'], ' ', ?$row['ip'], "\n";
}
這樣我覺(jué)得就可以說(shuō)明迭代器能隱藏?cái)?shù)據(jù)結(jié)構(gòu)這個(gè)特性了。我們的數(shù)據(jù)傳進(jìn)去的時(shí)候每行數(shù)據(jù)只有一個(gè)url屬性,但是迭代出來(lái)的時(shí)候多了一個(gè)ip屬性。這樣對(duì)外部的使用者來(lái)說(shuō)就是有兩個(gè)屬性(url和ip), 它不需要知道這個(gè)ip字段是創(chuàng)建者傳入的還是在迭代器中產(chǎn)生的。
更一般的做法
這里current方法返回的是一個(gè)關(guān)聯(lián)數(shù)組,更常規(guī)的做法是返回一個(gè)對(duì)象,此時(shí)這個(gè)迭代器可能還需要一個(gè)對(duì)象創(chuàng)建器。
總結(jié)
以上是生活随笔為你收集整理的php mysql迭代器_php 迭代器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: loadrunner支持php包吗,Lo
- 下一篇: linux如何把mysql表名换成小写_