1

我正在编写一个通用组件,它包装了一个生成器并进行常规操作:

  • 按键过滤
  • 转换价值
  • 等等

为了尽可能接近地模拟包装的生成器,如果生成器正在使用引用,我想使用引用。

当我尝试使用方法迭代非参考生成器foreach ($generator as $key => &$value)时,我收到以下错误:

如果它声明它产生按引用,则只能迭代一个生成器按引用

有没有办法找出手头的生成器是否正在返回引用?我没有成功使用反射:

$reflectedGeneratorValueSupplier = new \ReflectionMethod($generator, 'current');
$this->canReference = $reflectedGeneratorValueSupplier->returnsReference(); //always false

此外,不使用构造的迭代生成器foreach根本不适用于引用:

while ($generator->valid()) {
    $key = $generator->key();
    $value =& $generator->current(); //error, only variables can be passed by reference
    
    $generator->next();
}
4

1 回答 1

0

使用ReflectionGenerator然后getFunction似乎有效。

http://sandbox.onlinephpfunctions.com/code/92ed79dc7a6e925243f0c55898a5d1170f994189

<?php

function &generate(&$arr)
{
    foreach ($arr as $key => &$value) {
        yield $key => $value;
    }
};

$input = range(0,100);
$generator = generate($input);

$r = new ReflectionGenerator ($generator);

var_dump($r->getFunction()->returnsReference()); // true
于 2020-08-21T12:49:00.833 回答