PHP 核心特性 - 生成器基础篇

提出

PHP RFC 里描述了生成器的提出过程。考虑这样的需求

实现一个函数,用于获取文件内容,并可对文件内容进行遍历。

实现 1 - 普通函数

最普通的方式就是一次性读取文件内容,然后再进行遍历。

<?php

function getLinesFromFile($fileName) {

    // 打开文件
    if (!$fileHandle = fopen($fileName, 'r')) {
        return;
    }

    // 一次读取每一行并保存
    $lines = [];
    while (false !== $line = fgets($fileHandle)) {
        $lines[] = $line;
    }

    fclose($fileHandle);

    return $lines;
}

$lines = getLinesFromFile('test.txt');
foreach ($lines as $line) {

}

当使用该函数读取大文件时,就会因为内存不足而报错。

PHP Fatal error:  Allowed memory size of 134217728 bytes exhausted

实现 2 自定义对象

既然一次性读取文件内容行不通,只能考虑边读取边遍历,可使用面向对象的思想来解决。

PHP 中的对象,只要实现了 Iterator 接口,就可用 foreach 来进行遍历。

Iterator extends Traversable {
    // 返回当前索引游标指向的元素
    abstract public current ( void ) : mixed
    // 返回当前索引游标指向的键
    abstract public key ( void ) : scalar
    // 移动当前索引游标到下一元素
    abstract public next ( void ) : void
    // 重置索引游标
    abstract public rewind ( void ) : void
    // 判断当前索引游标指向的元素是否有效
    abstract public valid ( void ) : bool
}

利用这点,可以手动实现 Iterator 接口,来实现边读取文件边进行遍历功能。

<?php

class L
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值