在回调中使用收益率?

时间:2015-04-20 09:57:19

标签: php callback generator yield

我有一个函数y(),它应该会产生一些记录。

然而,此函数获取回调中的记录,该回调将传递给另一个函数d()以访问数据。 d()不会返回或产生任何内容。

如果接受回调的其他函数d()被视为黑盒子,那么这种模式是否可行? 什么是替代设计?

function y() {
    d( function ($records) { // May be called multiple times
        // How to yield for "y()"?
        foreach ($records as $record)
            yield $record;
    } );
}

2 个答案:

答案 0 :(得分:1)

yield将匿名回调函数转换为生成函数。您需要调用此生成器函数来接收生成器,然后迭代该生成器。但由于d正在调用匿名函数,因此它是以生成器结束的函数,而不是y的调用者。所以这没用,事实上也没有用。

你能做的最好就是:

function y() {
    $results = [];
    d(function ($val) use (&$results) {
        $results[] = $val;
    });
    return $results;
}

foreach (y() as $val) {
    echo $val, PHP_EOL;
}

这当然取决于d在某些时候返回。如果在内部它使用无限循环,这不会有任何好处。在这种情况下,您需要继续从回调中调用进一步的回调,这是一种典型的事件监听模式。

答案 1 :(得分:0)

你可以即兴发起回调!我用一个对象(Generator)和array_map

数组做了
<?php

function pushyield($p){
    yield $p;
}

$tt[]=pushyield(1);
$tt[]=pushyield(10);
$tt[]=pushyield(100);





function parse($n)
{
//var_dump($n);echo('<hr style="width:30px;">');
   foreach($n as $ln) echo $ln.'<br>';
}


$b = array_map("parse", $tt);

?>