PHP中如何不修改Generator状态判断生成器是否处于开放状态
PHP 生成器开放状态判断实现
需求说明
无需修改生成器(Generator)的原有运行状态,即可判断该生成器是否尚未被耗尽、仍处于可迭代的开放状态。
实现代码
全版本兼容实现(PHP 5.5+)
通过反射读取生成器内部私有状态实现,完全不会触发生成器迭代逻辑,不会改动原有运行状态:
function is_open(\Generator $generator): bool { $reflection = new \ReflectionClass($generator); $stateProp = $reflection->getProperty('state'); $stateProp->setAccessible(true); // 生成器内部state值规则:0=未启动 1=运行中 2=已终止 return $stateProp->getValue($generator) !== 2; }
PHP 7.4+ 精简实现
PHP 7.4版本起生成器自带isTerminated()原生方法,可直接调用实现需求:
function is_open(\Generator $generator): bool { return !$generator->isTerminated(); }
验证测试
给出的测试用例可全部正常通过,无异常抛出:
function sample_generator_1() { yield 'blah'; } // 空生成器实现 function sample_generator_2() { if (false) yield 'blah'; } $g1 = sample_generator_1(); assert(is_open($g1)); foreach($g1 as $item) {} // 耗尽生成器 assert(!is_open($g1)); $g2 = sample_generator_2(); assert(is_open($g2)); foreach($g2 as $item) {} // 耗尽生成器 assert(!is_open($g2));
内容的提问来源于stack exchange,提问作者Jay Bienvenu
相关产品推荐
相关产品推荐

