V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
mikej
V2EX  ›  PHP

请问我这样使用 PHP 的迭代器对吗?

  •  
  •   mikej · 2015-01-15 20:45:55 +08:00 · 2698 次点击
    这是一个创建于 3600 天前的主题,其中的信息可能已经有所发展或是发生改变。
    class Foo
    {
    static public function bar()
    {
    $generator = function ($data) {
    foreach ($data as $key => $value) {
    yield $key => $value;
    }
    };

    $arr = array(); # 生成的 一个大数组

    foreach ($generator($arr) as $k => $v) {
    # do something
    }
    }
    }
    Foo::bar();


    这个今天我在项目中写的代码,不过回头想了下,这样会比直接循环好吗?感觉$arr(一个大数组)在作为参数传递也很耗费资源吧,还是我根本就是多此一举,请教一下各位。多谢!
    6 条回复    2015-01-18 01:01:40 +08:00
    Sunyanzi
        1
    Sunyanzi  
       2015-01-16 01:27:30 +08:00   ❤️ 1
    没错 ... 这就是多此一举 ... 为什么你会认为这样会比直接循环好的 ..?

    这样的性能损耗远比直接 foreach 一个大数组来的要大 ...

    当然如果你的目的是拖慢程序及增大脚本的内存占用才用的这种写法 ... 那么恭喜你达到了目的 ...
    mikej
        2
    mikej  
    OP
       2015-01-16 10:29:29 +08:00
    @Sunyanzi 感谢回复!

    确实是这样, 我查阅了一些资料, 正确的使用方法应该是在迭代器函数内, 也就是generator() 函数里生成数据, 才可以降低内存消耗

    再求问下大神, 你们会经常用到yield吗, 一般会用到哪些使用场景 ?
    xwsoul
        3
    xwsoul  
       2015-01-16 16:53:00 +08:00
    从数据源获取数据的时候需要的吧...
    不过yield 还没用过...
    Sunyanzi
        4
    Sunyanzi  
       2015-01-17 01:57:56 +08:00
    不会经常用到 ... 只是偶尔会用 ... 用法不外乎两种 ...

    其一是用来生成一个规律的结构 ... 比如下面这样 ...

    function gen() {
    for ( $i = 0; $i < 5; ++ $i ) {
    yield 1;
    yield 2;
    yield 3;
    }
    }

    foreach( gen() as $gen ) echo $gen;

    五个 123 只是示例 ... 生成的内容也可能是等差数列等比数列斐波那契数列一类的 ...

    同理还能用来步进式的读文件 ... 避免直接把整个文件都读到内存里 ...

    其二是用来挂起函数执行 ... 比如下面这样 ...

    function logger( $file ) {
    $f = fopen( $file, 'a' );
    for ( ;;; ) {
    $line = yield;
    fwrite( $f, $line );
    }
    }
    $log = logger( '/tmp/logger.log' );
    $log->send("First");
    $log->send("Second");
    $log->send("Third");

    这样可以避免每次都建立句柄或把句柄传递来传递去 ...
    mikej
        5
    mikej  
    OP
       2015-01-18 00:54:20 +08:00
    @Sunyanzi 涨姿势了,还有->send() 这种用法!

    多谢,不过 for 循环里多了一个分号哈 : )
    Sunyanzi
        6
    Sunyanzi  
       2015-01-18 01:01:40 +08:00
    @mikej 啊是多了 ... 两段代码都是我直接在回复框里顺手打的 ... 没留神 ... ><
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1290 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 17:57 · PVG 01:57 · LAX 09:57 · JFK 12:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.