Php 简明教程
PHP - Object Iteration
一个 foreach 循环可用于遍历 PHP 类的对象的公开可见的所有成员。此功能在 PHP 5 及其以后版本中提供。您当然可以访问实例方法中的私有属性列表。PHP 还定义了可用于此目的的 Iterator 接口。
Using foreach Loop
在下面的示例中,类的公开属性使用 foreach 循环列出。
Example
<?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";
}
?>
它将生成以下 output −
x => 100
y => 200
z => 300
请注意,只有公共成员才能在类外访问。如果类包含一个方法,则所有成员(公有、私有或受保护的)都可以从内部通过 foreach 循环进行遍历。
让我们在上面的 myclass 中添加一个迭代方法。
public function iterate() {
foreach ($this as $k=>$v) {
if (is_array($v)) {
var_dump($v);
echo PHP_EOL;
} else {
echo "$k : $v". PHP_EOL;
}
}
}
调用此实例方法以获取所有成员的列表。
它将生成以下 output −
var : Hello World
array(3) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
int(3)
}
x : 100
y : 200
z : 300
Using Iterator Interface
PHP 提供 Iterator 接口,用于可自身在内部进行迭代的外部迭代器或对象。它定义了下面需要在用户定义类中实现的抽象方法。
interface Iterator extends Traversable {
/* Methods */
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() 方法检查当前位置是否有效。
Example
下面的示例通过实现 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";
}
?>
它将生成以下 output −
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: