You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 10:54:02