如何 return Traversable 实例满足以下断言代码?

How to return instance of Traversable to meet following assertion code?

这里我有一个具有挑战性的php函数,它应该return一个instanceof Traversable(迭代器)并且还需要满足测试这个函数的其他断言。

函数没有错误,它计算的是斐波那契数列。功能是可以修改的,特意这样构造来挑战别人的。但是有一个限制,只能标记为 !!! (三个感叹号)可以更改。

public function getFibonacci($n) {
        $n2 = -($n1 = 1);
        while ($n --> -1) {
            $r = $n1 += $n2 and 0 or !!![$n + 1 => $n1];
            $n2 = $n1 - $n2;
        }
        return $r;
    }

这是一个 php单元代码,将测试 getFibonacci 函数

assertTrue(
    ($res = (getFibonacci(8))
    && ($res instanceof \Traversable)
    && count($arr = iterator_to_array($res)) === 9
    && array_keys($arr) == range(8, 0, -1)
    && array_values($arr) == [0, 1, 1, 2, 3, 5, 8, 13, 21]
);

所以希望添加一些代码而不是 !!! (三个感叹号)这样断言就会通过。

这是一个generator function

通过 yield from

生成器委派

在 PHP7 中,生成器委托允许您使用 yield from 关键字从另一个生成器、Traversable 对象或数组生成值。然后,外部生成器将从内部生成器、对象或数组中生成所有值,直到它们不再有效,之后将在外部生成器中继续执行。

如果生成器与 yield from 一起使用,则 yield from 表达式也将 return 由内部生成器编辑的任何值 return。

$r = $n1 += $n2 and 0 or !!![$n + 1 => $n1];

PS:在PHP中,逻辑运算符的优先级最低。因此,这个字符串相当于

$r = $n1 += $n2;
!!![$n + 1 => $n1];