首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >有没有一种方法可以测试闭包是否也是生成器?

有没有一种方法可以测试闭包是否也是生成器?
EN

Stack Overflow用户
提问于 2014-08-06 01:34:07
回答 1查看 1.8K关注 0票数 18

我正在使用一个PHP类,它需要接受多种类型的迭代器,并将它们包含在一个统一的包装器中。

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

代码语言:javascript
复制
$anon = function() { yield 1; yield 2; };   // build anonymous generator
gettype($anon);                             // "object"
$anon instanceof \Traversable;              // 0
$anon instanceof \Iterable;                 // 0
$anon instanceof \IteratorAggregate;        // 0
$anon instanceof \Generator;                // 0
$anon instanceof \Closure;                  // 1 -- but doesn't tell me whether or not the closure is actually generator

$anon = $anon();                            // invoke, then run the same checks
gettype($anon);                             // "object"
$anon instanceof \Traversable;              // 1 (!!!)
$anon instanceof \Iterable;                 // 0
$anon instanceof \IteratorAggregate;        // 0
$anon instanceof \Generator;                // 1 (!!!)
$anon instanceof \Closure;                  // 0

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

PHP中是否有我遗漏的方法/类型可以用来确定尚未调用的匿名方法是否为生成器?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-06 01:53:02

代码语言:javascript
复制
$anon = function() { echo 'INVOKED', PHP_EOL; yield 1; yield 2; };
$r = new ReflectionFunction($anon);
var_dump($r->isGenerator());

显示

代码语言:javascript
复制
bool(true);

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

票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25144939

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档