PHP遍歴対象
3986 ワード
foreach
PHP 5は、foreach文の場合、デフォルトではすべてのpublic属性が巡回に使用されるセルリストを介してオブジェクトを巡回する方法を提供する.クラスメソッドでループする場合は、protectedプロパティとprivateプロパティにもアクセスできます.親から継承されたプロパティも遍歴されます.
Iterator
クラスにIteratorインタフェースが実装されている場合は、どの値をループするか、毎回どの値をループするかを自分で決定できます.Iteratorインタフェースが実装されたオブジェクトをforeachすると、Iteratorインタフェースで定義されたメソッドが自動的に呼び出されます.rewind()->valid()->current()->key()->next()->valid()->current()->key()->next()->valid()valid()がfalseを返してループを終了するまで.
ループする前にrewindリセットポインタを呼び出し、validはループが終了したかどうかを検証し、currentは現在のポインタの値を取得し、keyは現在のポインタのキーを取得し、nextはポインタを移動し、移動後のポインタの値を返します.
IteratorAggregate
IteratorAggregateインタフェースは、Iteratorを実装する方法に代わることができる.IteratorAggregateインタフェースを実装するgetIteratorメソッドのみで、このメソッドはIteratorインタフェースを実装したクラスのインスタンスを返す必要があります.
PHP 5は、foreach文の場合、デフォルトではすべてのpublic属性が巡回に使用されるセルリストを介してオブジェクトを巡回する方法を提供する.クラスメソッドでループする場合は、protectedプロパティとprivateプロパティにもアクセスできます.親から継承されたプロパティも遍歴されます.
$value) {
echo "$key=$value
";
}
}
}
$a=new A();
$a->showProperties();
foreach ($a as $key=>$value) {
echo "$key=$value
";
}
?>
Iterator
クラスにIteratorインタフェースが実装されている場合は、どの値をループするか、毎回どの値をループするかを自分で決定できます.Iteratorインタフェースが実装されたオブジェクトをforeachすると、Iteratorインタフェースで定義されたメソッドが自動的に呼び出されます.rewind()->valid()->current()->key()->next()->valid()->current()->key()->next()->valid()valid()がfalseを返してループを終了するまで.
ループする前にrewindリセットポインタを呼び出し、validはループが終了したかどうかを検証し、currentは現在のポインタの値を取得し、keyは現在のポインタのキーを取得し、nextはポインタを移動し、移動後のポインタの値を返します.
var=$arg;
$this->var1=$arg1;
$this->var2=$arg2;
$this->var3=$arg3;
$this->var4=$arg4;
$this->arr["var"]=$arg;
$this->arr["var1"]=$arg1;
$this->arr["var2"]=$arg2;
$this->arr["var3"]=$arg3;
}
public function rewind() {
echo "rewinding
";
reset($this->arr);
}
public function current() {
$arr = current($this->arr);
echo "current: $arr
";
return $arr;
}
public function key() {
$arr = key($this->arr);
echo "key: $arr
";
return $arr;
}
public function next() {
$arr = next($this->arr);
echo "next: $arr
";
return $arr;
}
public function valid() {
$arr = key($this->arr)!==null;
echo "valid: {$arr}
";
return $arr;
}
}
$a = new A("a","a1","a2","a3","a4");
foreach ($a as $k => $v) {
print "$k: $v
";
}
?>
IteratorAggregate
IteratorAggregateインタフェースは、Iteratorを実装する方法に代わることができる.IteratorAggregateインタフェースを実装するgetIteratorメソッドのみで、このメソッドはIteratorインタフェースを実装したクラスのインスタンスを返す必要があります.
arr["var"]=$arg;
$this->arr["var1"]=$arg1;
$this->arr["var2"]=$arg2;
}
function getIterator(){
return new MyIterator($this->arr);
}
}
class MyIterator implements Iterator{
private $vars;
public function __construct($arr){
$this->vars=$arr;
}
public function rewind() {
echo "rewinding
";
reset($this->vars);
}
public function current() {
$arr = current($this->vars);
echo "current: $arr
";
return $arr;
}
public function key() {
$arr = key($this->vars);
echo "key: $arr
";
return $arr;
}
public function next() {
$arr = next($this->vars);
echo "next: $arr
";
return $arr;
}
public function valid() {
$arr = key($this->vars)!==null;
echo "valid: {$arr}
";
return $arr;
}
}
$a=new A("a","a1","a2");
foreach ($a as $k => $v) {
print "$k: $v
";
}
?>