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
相关产品推荐
相关产品推荐

