PHP中实现Iterator接口的类填充数组时出现异常行为
解析PHP Iterator类中echo $this的问题
嘿,咱们来聊聊你代码里echo $this这行的门道~
首先直接说核心:PHP默认不能直接用echo输出对象实例,当你这么做的时候,它会自动去调用对象的__toString()魔术方法——如果你的类没定义这个方法,立马就会抛出致命错误:Object of class [你的类名] could not be converted to string。
先把你的关键代码贴出来方便对照:
class YourCollection implements Iterator { private $records = []; /** * 向activeRecord集合添加条目 * @param IActiveRecord $activeRecord */ public function set(IActiveRecord $activeRecord){ echo "Add" . $activeRecord->id . " to collection<br>"; $this->records[] = $activeRecord; echo $this . "<br>"; // 问题就出在这一行 } // 这里必须实现Iterator接口要求的5个方法:current(), key(), next(), rewind(), valid() }
怎么解决这个问题?
最简单的办法就是给你的集合类加上__toString()魔术方法,让它返回你想要展示的字符串内容,比如集合的记录数、类名之类的:
public function __toString() { // 举个例子,返回类名和当前记录数量 return sprintf('%s 集合,当前包含 %d 条记录', __CLASS__, count($this->records)); }
这样再执行echo $this的时候,就会输出类似YourCollection 集合,当前包含 1 条记录的内容,不会报错了。
额外的小提示
- 因为你的类实现了
Iterator接口,可别忘了必须实现接口强制要求的5个方法:current()、key()、next()、rewind()、valid(),不然PHP会直接给你甩错误。 - 如果只是想调试看集合的详细内容,其实用
var_dump($this)或者print_r($this)更方便,这俩函数不需要依赖__toString()就能输出对象的完整结构。
内容的提问来源于stack exchange,提问作者Jean-Luc Aubert
相关产品推荐
相关产品推荐

