Php 如何通过引用确定生成器是否生成?

Php 如何通过引用确定生成器是否生成?,php,php-generators,Php,Php Generators,我正在编写一个通用组件,该组件封装了一个生成器并执行常规操作: 按键筛选 转换值 等等 为了尽可能接近地模拟包装的生成器,如果生成器使用引用,我希望使用引用 当我尝试使用foreach($generator as$key=>&$value)方法迭代非引用生成器时,我收到以下错误: 如果生成器声明通过引用生成,则只能通过引用对其进行迭代 是否有办法确定手头的生成器是否返回引用?我没有成功地使用反射: $reflectedGeneratorValueSupplier = new \Reflect

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

  • 按键筛选
  • 转换值
  • 等等
为了尽可能接近地模拟包装的生成器,如果生成器使用引用,我希望使用引用

当我尝试使用
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();
}
使用,然后似乎工作

使用和然后似乎可以工作


看看这个-对不起,我不明白这和手头的问题有什么关系。我需要找出一个生成器是否可以通过引用生成,而不是构造一个生成引用的生成器。什么是
iDereflection
?这是自定义反射库吗?也许它在显示的函数中有一个bug?不,不是它,只是把它看作一个预udocode
$generator->current()
只是一个不通过引用返回的方法。无论您如何定义生成器函数。@informatik-handerk.de我都感到困惑;你说“我没有成功使用反射”,并向我们展示了一些反射代码,但现在你说这是“伪代码”。您实际尝试的代码是什么?请把问题包括在内,这样我们就不会被迫猜测你到底在做什么。看这个-对不起,我不明白这和手头的问题有什么关系。我需要找出一个生成器是否可以通过引用生成,而不是构造一个生成引用的生成器。什么是
iDereflection
?这是自定义反射库吗?也许它在显示的函数中有一个bug?不,不是它,只是把它看作一个预udocode
$generator->current()
只是一个不通过引用返回的方法。无论您如何定义生成器函数。@informatik-handerk.de我都感到困惑;你说“我没有成功使用反射”,并向我们展示了一些反射代码,但现在你说这是“伪代码”。您实际尝试的代码是什么?请把问题包括在内,这样我们就不会被迫猜测你到底在做什么。
<?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