php 5.2+ 中遍历对象有四种方式:1. 直接 foreach 遍历仅 public 属性;2. 实现 iterator 接口完全自定义遍历逻辑;3. 实现 iteratoraggregate 委托给 arrayiterator 等标准迭代器;4. 使用 iterator_apply 进行回调式批量处理。

PHP 5.2+ 中遍历对象,核心是让对象具备“可迭代”能力。原生对象默认只暴露 public 属性 给 foreach,但若需更精细控制(比如包含 protected/private 成员、按特定顺序、动态生成数据、或封装逻辑),就得借助内置的迭代器接口和相关函数。
以下几种方式都适用于 PHP 5.2 及以上版本,且无需额外扩展:
直接用 foreach 遍历普通对象(最简方式)
只要对象属性是 public,foreach 就能直接遍历:
class User {
public $name = 'Alice';
public $age = 30;
protected $role = 'member';
private $id = 123;
}
$user = new User();
foreach ($user as $key => $value) {
echo "$key => $value\n";
}
// 输出:name => Alice,age => 30(仅 public 属性)
⚠️ 注意:protected 和 private 属性不会出现在 foreach 结果中,除非在类内部方法中调用(如示例中的 iterateVisible())。
实现 Iterator 接口(完全自定义遍历行为)
适用于需要手动控制每一步(如分页读取、流式处理、状态维护等):
class Counter implements Iterator {
private $start;
private $end;
private $current;
public function __construct($start = 1, $end = 5) {
$this->start = $start;
$this->end = $end;
$this->rewind();
}
public function rewind() {
$this->current = $this->start;
}
public function current() {
return $this->current;
}
public function key() {
return $this->current;
}
public function next() {
$this->current++;
}
public function valid() {
return $this->current end;
}
}
$counter = new Counter(3, 6);
foreach ($counter as $key => $val) {
echo "[$key] => $val\n";
}
// 输出:[3] => 3,[4] => 4,[5] => 5,[6] => 6
✅ 优点:完全掌控遍历逻辑;支持 break/continue;与 foreach 无缝兼容。
实现 IteratorAggregate 接口(委托给现有迭代器)
更轻量、更常用——把遍历逻辑委托给标准迭代器(如 ArrayIterator、ArrayObject):
class BookCollection implements IteratorAggregate {
private $books = ['PHP Basics', 'OOP in PHP', 'Design Patterns'];
public function getIterator(): Traversable {
return new ArrayIterator($this->books);
}
}
$collection = new BookCollection();
foreach ($collection as $index => $title) {
echo "$index: $title\n";
}
// 输出:0: PHP Basics,1: OOP in PHP,2: Design Patterns
✅ 优点:代码简洁;复用成熟迭代器;天然支持 count()(配合 Countable)、offsetExists()(配合 ArrayAccess)等。
使用 iterator_apply(面向过程风格的回调遍历)
适合一次性操作,不依赖 foreach 语法,且需对每个元素执行相同逻辑:
class DataHolder {
public $items = [10, 20, 30];
}
$data = new DataHolder();
iterator_apply(
new ArrayIterator($data->items),
function($value) {
echo "Processing: $value\n";
return true; // 必须返回 true 才继续
}
);
// 输出三行 Processing: ...
⚠️ 注意:iterator_apply 不返回新数组,也不支持键名访问;回调函数必须返回 true,否则提前终止。
不复杂但容易忽略。关键不在“能不能”,而在于选对方式:
- 纯 public 属性 → 直接
foreach; - 要封装逻辑或状态 →
Iterator; - 要复用数组语义 →
IteratorAggregate+ArrayIterator; - 要批量回调无返回 →
iterator_apply。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











