加入收藏 | 设为首页 | 会员中心 | 我要投稿 聊城站长网 (https://www.0635zz.com/)- 智能语音交互、行业智能、AI应用、云计算、5G!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP生成器和迭代器对象的对比是怎样的?

发布时间:2023-06-06 13:33:22 所属栏目:PHP教程 来源:
导读:这篇文章给大家分享的是“PHP生成器和迭代器对象的比较是怎样的?”,对大家学习和理解有一定的参考价值和帮助,有这方面学习需要的朋友,接下来就跟随小编一起学习一下吧。

生成器最大的优势就是简单
这篇文章给大家分享的是“PHP生成器和迭代器对象的比较是怎样的?”,对大家学习和理解有一定的参考价值和帮助,有这方面学习需要的朋友,接下来就跟随小编一起学习一下吧。
 
生成器最大的优势就是简单,和实现Iterator的类相比有着更少的样板代码,并且代码的可读性也更强. 例如, 下面的函数和类是等价的:
 
<?php
 
    function getLinesFromFile($fileName) {
 
        if (!$fileHandle = fopen($fileName, 'r')) {
 
            return;
 
        }
 
        while (false !== $line = fgets($fileHandle)) {
 
            yield $line;
 
        }
 
        fclose($fileHandle);
 
    }
 
    // versus...
 
    class LineIterator implements Iterator {
 
        protected $fileHandle;
 
        protected $line;
 
        protected $i;
 
        public function __construct($fileName) {
 
            if (!$this->fileHandle = fopen($fileName, 'r')) {
 
                throw new RuntimeException('Couldn\'t open file "' . $fileName . '"');
 
            }
 
        }
 
        public function rewind() {
 
            fseek($this->fileHandle, 0);
 
            $this->line = fgets($this->fileHandle);
 
            $this->i = 0;
 
        }
 
        public function valid() {
 
            return false !== $this->line;
 
        }
 
        public function current() {
 
            return $this->line;
 
        }
 
        public function key() {
 
            return $this->i;
 
        }
 
        public function next() {
 
            if (false !== $this->line) {
 
                $this->line = fgets($this->fileHandle);
 
                $this->i++;
 
            }
 
        }
 
        public function __destruct() {
 
            fclose($this->fileHandle);
 
        }
 
    }
 
?>
 
这种灵活性也付出了代价:生成器是前向迭代器,不能在迭代启动之后往回倒. 这意味着同一个迭代器不能反复多次迭代: 生成器需要需要重新构建调用,或者通过clone关键字克隆.
 
 

(编辑:聊城站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!