类与对象(PHP5)之八:对象迭代(Object Iteration)

日期:2006-09-26  作者:喜腾小二  来源:PHPChina


PHP5提供一个为对象定义通过一连串的消息被重述的途径成为可能,例如使用一个foreach语句。默认地,所有可见的属性将用来迭代(反复)。
例子
19-20. 简单的对象迭代(Simple Object Iteration)
PHP代码如下:

php
class MyClass
{   public $var1 'value 1';
    
public $var2 'value 2';
    
public $var3 'value 3';
    
protected $protected 'protected var';
    
private   $private   'private var';
    function 
iterateVisible() 
    {   echo 
"MyClass::iterateVisible:
"
;
       foreach(
$this as $key => $value){  print "$key => $value
"
;  }
    }
}
$class = new MyClass();
foreach(
$class as $key => $value){   print "$key => $value
"
;  }
echo 
"
"
;
$class->iterateVisible();
?> 


如输出显示,foreach重述能通过全部可见变量被访问。更进一步,你可以实现一个PHP5的指定的内在接口迭代器(Iterator)。允许对象描述什么是对象重述和对象如何被重述的。
例子
19-21. 迭代器实现对象迭代(Object Iteration implementing Iterator)
PHP代码如下:

php
class MyIterator implements Iterator
{   private $var = array();
    
public function __construct($array)
    {   if (
is_array($array)){  $this->var $array; }
    }
    
public function rewind() 
    {    echo 
"rewinding
"
;
        
reset($this->var);
 }
    
public function current()
    {   
$var current($this->var);
        echo 
"current: $var
"
;
        return 
$var;
    }
    
public function key() 
    {    
$var key($this->var);
        echo 
"key: $var
"
;
        return 
$var;
    }
    
public function next() 
    {    
$var next($this->var);
        echo 
"next: $var
"
;
        return 
$var;
    }
    
public function valid() 
    {    
$var $this->current() !== false;
        echo 
"valid: {$var}
"
;
        return 
$var;
    }
}
$values = array(1,2,3);
$it = new MyIterator($values);
foreach (
$it as $a => $b) {  print "$a: $b
"
;  }
?> 


上例将输出:

CODE:
rewinding
current: 1
valid: 1
current:
1
key: 0
0: 1
next: 2
current: 2
valid: 1
current: 2
key:
1
1: 2
next: 3
current: 3
valid: 1
current: 3
key: 2
2:
3
next:
current:
valid:

在定义类时你也可以不必通过简单实现PHP5的IteratorAggregate接口定义所有的迭代器函数。
例19-22.IteratorAggregate对象迭代实现
PHP代码如下:

php
class MyCollection implements IteratorAggregate
{   private $items = array();
    
private $count 0;
    
// Required definition of interface IteratorAggregate
    
public function getIterator() 
    {    return new 
MyIterator($this->items);
    }
     
public function add($value
    {    
        
$this->items[$this->count++] = $value;
    }
}
$coll = new MyCollection();
$coll->add('value 1');
$coll->add('value 2');
$coll->add('value 3');
foreach (
$coll as $key => $val){  echo "key/value: [$key -> $val]

"
;  }
?> 


上例将输出:

[Copy to clipboard]CODE:
rewinding
current: value 1
valid:
1
current: value 1
key: 0
key/value: [0 -> value 1]
next: value
2
current: value 2
valid: 1
current: value 2
key: 1
key/value: [1
-> value 2]
next: value 3
current: value 3
valid: 1
current:
value 3
key: 2
key/value: [2 -> value
3]
next:
current:
valid:

<<<返回技术中心

技术文章

站内新闻

我要啦免费统计