我阅读了PHP手册中的IteratorAggregate示例。我试图删除IteratorAggregate接口,但输出与实现的接口相似。
<?php
class myData {
public $property1 = "Public property one";
public $property2 = "Public property two";
public $property3 = "Public property three";
public function __construct() {
$this->property4 = "last property";
}
}
$obj = new myData;
foreach($obj as $key => $value) {
var_dump($key, $value);
echo "'n";
}
输出:
string(9) "property1"
string(19) "Public property one"
string(9) "property2"
string(19) "Public property two"
string(9) "property3"
string(21) "Public property three"
string(9) "property4"
string(13) "last property"
我想知道我们什么时候应该实现IteratorAggregate接口?为什么输出是相同的?
手册页面中的示例并不好,正是因为您在这里描述了什么。示例类实现IteratorAggregate
并执行以下操作:
public function getIterator() {
return new ArrayIterator($this);
}
ArrayIterator
在与对象一起提供时,只提供对象的公共属性。正如您所演示的,这可以通过对原始对象执行foreach
来实现。
一个更有用的例子是,如果我们想反映不同的价值选择。例如,假设所有这些元素都是private
,我们不想发送$property3
:
class myData implements IteratorAggregate {
private $property1 = "Public property one";
private $property2 = "Public property two";
private $property3 = "Public property three";
public function __construct() {
$this->property4 = "last property";
}
public function getIterator() {
return new ArrayIterator(array(
'property1' => $this->property1,
'property2' => $this->property2,
'property4' => $this->property4
));
}
}
$obj = new myData;
foreach($obj as $key => $value) {
var_dump($key, $value);
echo "'n";
}
这将使用您想要的属性(而不是所有属性)构造迭代器。
您可以用这种方式构造任何迭代器,即使是与类的属性完全无关的迭代器。通常,最好的方法是实现Iterator
,但有时if会更快地构造一个新的迭代器对象,并用getIterator
指向它。
现在更改代码以使用PRIVATE或PROTECTED属性,然后重试。。。
当前的效果是,如果对具有公共属性的对象进行迭代,则该对象将被强制转换为数组,使所有公共属性都成为键和值。这就是你所拥有的。
使用interator接口,您可以迭代公共属性中不可用的值。它们还不如在您访问它们的那一刻就生成,即从数据库中提取。