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

PHP类中如何在__toString()方法中使用yield?求解决方案

在PHP的__toString()中使用yield的解决方案

兄弟,先给你划个重点:PHP的__toString()方法必须返回字符串,但只要你在方法里用了yield,这个方法就会变成生成器方法,返回的是Generator对象,这直接违反了__toString()的返回规则,会触发致命错误。所以直接在__toString()里写yield是走不通的,得换个思路处理。

可行的解决方案

把生成器的逻辑单独放到一个方法里(比如你示例中的data()),然后在__toString()中遍历这个生成器的结果,把所有值拼接成字符串返回。如果你的$i本身是可遍历对象(包括生成器),也可以直接遍历它来构建输出字符串。

结合你的代码修改示例

下面是完善后的完整代码,你可以直接参考:

<?php
class Test {
    private $i;

    public function find() {
        $this->i = [1, 2, 3];
        return $this;
    }

    // 生成器逻辑单独放在这个方法里
    public function data() {
        for ($num = 1; $num <= 3; $num++) {
            yield $num;
        }
    }

    public function __toString() {
        $output = '';

        // 场景1:处理$this->i是数组/可遍历对象的情况
        if (is_iterable($this->i)) {
            foreach ($this->i as $value) {
                $output .= $value . ', ';
            }
        } 
        // 场景2:如果想直接输出data()生成器的结果,就用这段代码
        // foreach ($this->data() as $value) {
        //     $output .= $value . ', ';
        // }

        // 去掉末尾多余的逗号和空格
        return rtrim($output, ', ');
    }
}

// 测试示例
$test = new Test();
echo $test->find(); // 输出:1, 2, 3
echo "\n";
// 如果把__toString改成场景2的逻辑,直接echo $test就会输出1, 2, 3

额外说明

  • is_iterable()是PHP 7.1+新增的函数,能判断变量是否是数组或者实现了Traversable接口的对象(包括生成器),兼容性更强。
  • 本质上,生成器本身是可遍历的,所以只要在__toString()里遍历生成器,把每个yield出来的值拼接成字符串,就能实现你想要的关联效果。

内容的提问来源于stack exchange,提问作者Scaffold

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:07:52