Php 是否有一种方法可以测试闭合是否也是发电机?

Php 是否有一种方法可以测试闭合是否也是发电机?,php,closures,generator,yield,Php,Closures,Generator,Yield,我正在使用一个PHP类,它需要接受多种类型的迭代器,并将它们包含在一个统一的包装器中。我需要支持(而且可以!)的迭代器类型之一是包含yield关键字的匿名函数——本质上是一个匿名生成器 PHP中有没有一种方法可以测试匿名函数是否是生成器?以下是我尝试过的方法列表(旨在显示输出,而不是我如何使用它们): 正如您在上面所看到的,我可以调用匿名函数,然后确定该函数是否为可遍历类型,但为了以延迟加载方式实现这一点(例如,围绕SQL语句调用的匿名函数包装,后跟每条记录的产量),我不能在foreach迭代之

我正在使用一个PHP类,它需要接受多种类型的迭代器,并将它们包含在一个统一的包装器中。我需要支持(而且可以!)的迭代器类型之一是包含yield关键字的匿名函数——本质上是一个匿名生成器

PHP中有没有一种方法可以测试匿名函数是否是生成器?以下是我尝试过的方法列表(旨在显示输出,而不是我如何使用它们):

正如您在上面所看到的,我可以调用匿名函数,然后确定该函数是否为可遍历类型,但为了以延迟加载方式实现这一点(例如,围绕SQL语句调用的匿名函数包装,后跟每条记录的产量),我不能在foreach迭代之前调用匿名函数

PHP中是否有我缺少的方法/类型可用于确定尚未调用的匿名方法是否为生成器

$anon = function() { echo 'INVOKED', PHP_EOL; yield 1; yield 2; };
$r = new ReflectionFunction($anon);
var_dump($r->isGenerator());
显示


调用的
根本不显示,这证明了闭包在任何时候都不会被调用

对于那些想知道匿名函数不是生成器的人来说。它返回生成器作为其调用的结果

根据:

第一次调用生成器函数时,将返回内部生成器类的对象


看起来很有希望!我猜ReflectionFunction构造函数不需要调用闭包来检索该信息?不,ReflectionFunction根本不调用闭包
$anon = function() { echo 'INVOKED', PHP_EOL; yield 1; yield 2; };
$r = new ReflectionFunction($anon);
var_dump($r->isGenerator());
bool(true);