我有一个函数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;
} );
}
答案 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);
?>