可以使用 foreach 循环来遍历 PHP 类的对象的所有公开可见成员。此功能已在 PHP 5 及更高版本中可用。当然,您可以访问实例方法中的 private 属性列表。
PHP 还定义了可用于此目的的 迭代器(Iterator)接口。
使用 foreach 循环
在下面的示例中,使用 foreach 循环列出了类的公共属性。
<?php
class myclass {
private $var;
protected $var1;
public $x, $y, $z;
public function __construct() {
$this->var="Hello World";
$this->var1=array(1,2,3);
$this->x=100;
$this->y=200;
$this->z=300;
}
}
$obj = new myclass();
foreach($obj as $key => $value) {
print "$key => $value\n";
}
?>
它将产生以下输出 -
x => 100
y => 200
z => 300
y => 200
z => 300
请注意,只有 public 成员可以在类外部访问。如果类包含方法,则所有成员(public、private 或 protected)都可以使用其内部的 foreach 循环遍历。
让我们在上面的 myclass 添加一个 iterate 方法。
public function iterate() {
foreach ($this as $k=>$v) {
if (is_array($v)) {
var_dump($v);
echo PHP_EOL;
} else {
echo "$k : $v". PHP_EOL;
}
}
}
调用此实例方法可获取所有成员的列表。
它将产生以下输出 -
var : Hello World
array(3) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
int(3)
}
x : 100
y : 200
z : 300
array(3) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
int(3)
}
x : 100
y : 200
z : 300
使用迭代(Iterator) 接口
PHP 为外部迭代器或对象提供了 迭代(Iterator) 接口,这些迭代器或对象可以在内部自行迭代。它定义了以下需要在用户定义的类中实现的抽象方法。
interface Iterator extends Traversable {
/* 方法 */
public current(): mixed
public key(): mixed
public next(): void
public rewind(): void
public valid(): bool
}
- rewind() 方法将 Iterator 倒回第一个元素。这是启动 foreach 循环时调用的第一个方法。它不会在 foreach 循环后执行。
- current() 方法返回当前元素。
- key() 方法在 foreach 循环的每次迭代中返回当前元素的键。
- next() 方法在 foreach 循环的每次迭代后调用,并向前移动到下一个元素。
- valid() 方法检查当前位置是否有效。
示例
以下示例通过实现 Iterator 接口演示了对象迭代
<?php
class myclass implements Iterator {
private $arr = array('a','b','c');
public function rewind():void {
echo "rewinding\n";
reset($this->arr);
}
public function current() {
$var = current($this->arr);
echo "current: $var\n";
return $var;
}
public function key() {
$var = key($this->arr);
echo "key: $var\n";
return $var;
}
public function next() : void {
$var = next($this->arr);
echo "next: $var\n";
# return $var;
}
public function valid() : bool {
$key = key($this->arr);
$var = ($key !== NULL && $key !== FALSE);
echo "valid: $var\n";
return $var;
}
}
$obj = new myclass();
foreach ($obj as $k => $v) {
print "$k: $v\n";
}
?>
它将产生以下输出 -
rewinding
valid: 1
current: a
key: 0
0: a
next: b
valid: 1
current: b
key: 1
1: b
next: c
valid: 1
current: c
key: 2
2: c
next:
valid: 1
current: a
key: 0
0: a
next: b
valid: 1
current: b
key: 1
1: b
next: c
valid: 1
current: c
key: 2
2: c
next: