迭代器模式

迭代器模式

作者:LAMP小白  点击:1708  发布日期:2012-10-07 21:03:00  返回列表
迭代器模式可以帮助构造特定对象,哪些对象能能够提供单一标准接口循环或迭代任何类型的可计数数据

一个实现了SPL迭代器的例子,我改了里面的一些代码,可能是理解不了,可能是这个例子本来就有问题

首先是SQL查出一些数据,这个没什么说的

然后遍历这些数据,因为一张CD里面有很多歌,所以需要根据CD ID来判断是不是同一张CD,如果是且已经完成了初始化,那么就直接调用CD类里面的addtracks方法

如果还没有初始化,那么就new cd类(注意,CD类并不是专门为某个CD服务的,他也是一个抽象操作的类),再将为这张CD服务的对象加入数组

数组cds就好比是一张光盘架,里面保存着每张光盘的实例化对象,每个实例化对象又保存着曲目信息

但是光盘架并不知道他将会保存哪些光盘

mio_lt;?php
    class cd
    {
        public $band = '';
        public $title = '';
        public $trackList = array();
        public function __construct($band, $title)
        {
            $this-mio_gt;band = $band;
            $this-mio_gt;title = $title;
        }
        public function addTrack($track)
        {
            $this-mio_gt;trackList[] = $track;
        }
    }
    class CDSreachByBandIterator
    {
        private $_cds = array();
        private $_valid = false;
        public function __construct()
        {
            $db = mysql_connect('localhost', 'root', '098098');
            mysql_select_db('test');
            //查出信息 查询方法很老
            $sql = 'select CD.id, CD.band, CD.title, tracks.tracknum, ';
            $sql .= 'tracks.title as tracktitle';
            $sql .= 'from CD left join tracks on CD.id=tracks.cid where band='';
            $sql .= mysql_real_escape_string($bandName);
            $sql .= '' order by tracks.traknum';
            $result = mysql_query($sql);
            $cdID = 0;
            $cd = null;
            while($result = mysql_fetch_array($result)){
                //检测这个CD的ID是否已经存在(存在就代表已经有实例化的对象了,直接addtrack就可以)
                if($result['id'] !== $cdID){
                    $cd = new CD($result['band'], $result['title']);
                    $cdID = $result['id'];
                    //将实例化的CD加入到数组
                    $this-mio_gt;cds[] = $cd;
                }
                $cd -mio_gt; addTrack($result['trackTitle']);
            }
        }
        public function next()
        {
            $this-mio_gt;_valid = (next($this-mio_gt;_cds) === false)? false : true;
        }
        public function rewind()
        {
            $this-mio_gt;_valid = (reset($this-mio_gt;_cds) === false)? false : true;
        }
        public function valid()
        {
            return $this-mio_gt;_valid;
        }
        public function current()
        {
            return current($this-mio_gt;cds);
        }
        public function key()
        {
            return key($this-mio_gt;_cds);
        }
    }
?mio_gt;



上一篇:要过滤数据库输入 下一篇:快递查询API
0