通過 foreach
可以得到對(duì)象所有公開的屬性命满,在類的內(nèi)部還能獲取到私有的和受保護(hù)的屬性。
通過實(shí)現(xiàn) Iterator
接口歼疮,可以使得對(duì)象在被 foreach
循環(huán)時(shí)處理一些事情诈唬。
// 定義類
class Example implements Iterator{
// 內(nèi)部屬性
private $property = [];
// 構(gòu)造函數(shù)
public function __construct(array $data){
$this->property = $data;
}
// 初始化:重置指針,將指針移動(dòng)到第一位赡矢,僅在foreach初始化時(shí)運(yùn)行一次
public function rewind(){
echo "0.rewind <br /><hr />";
reset($this->property);
}
// 第一步:驗(yàn)證當(dāng)前指針指向的元素是否存在
public function valid(){
echo "1.valid <br />";
return current($this->property);
}
// 第二步:獲取當(dāng)前指針指向的元素
public function current(){
echo "2.current <br />";
$idx = current($this->property);
echo " $idx <br />";
return $idx;
}
// 第三步:獲取當(dāng)前指針指向的索引
public function key(){
echo "3.key <br />";
$key = key($this->property);
echo " $key <br />";
return $key;
}
// 第四步:在foreach里循環(huán)
// 第五步:指針往下移動(dòng)一步
public function next(){
echo "5.next <br /> <hr />";
return next($this->property);
}
}
// 實(shí)例化
$exam = new Example(['a' => 'php', 'b' => 'asp', 'c' => 'jsp']);
// 循環(huán)遍歷這個(gè)對(duì)象
foreach ($exam as $key => $value) {
echo "4.[$key : $value] <br />";
}
還一種方法阅仔,只需要返回一個(gè) Iterator
類的實(shí)例即可。
// 定義類
class Example implements IteratorAggregate{
// 私有屬性
private $array = [];
// 構(gòu)造函數(shù)
public function __construct(array $array = []){
$this->array = $array;
}
// 接口方法實(shí)現(xiàn)
public function getIterator(){
// 返回一個(gè)Iterator類的實(shí)例空民,此處用匿名類實(shí)現(xiàn)
return new class($this->array) implements Iterator{
private $data;
public function __construct(array $data){
$this->data = $data;
}
public function rewind(){
reset($this->data);
}
public function valid(){
return current($this->data) !== false;
}
public function current(){
return current($this->data);
}
public function key(){
return key($this->data);
}
public function next(){
return next($this->data);
}
};
}
}
// 實(shí)例化
$exam = new Example(['a' => 'php', 'b' => 'asp', 'c' => 'jsp']);
// 循環(huán)遍歷這個(gè)對(duì)象
foreach ($exam as $key => $value) {
echo "$key : $value <br />";
}