我想执行一些魔术,以便当我尝试迭代一个对象时,我将实际迭代对象内的一个数组。类似于循环的吸气剂。
class A {
protected $array = [1,2,3];
public function __foriteration() {
return $this->array;
}
}
$a = new A;
foreach($a as $value) {
echo $value;
}
// output should be "123"
甚至不确定这是否可行,但我怀疑我应该使用ArrayObject
,但对我来说这不是很简单,我无法弄清楚如何做到这一点。
请注意:我可以定义一个getter方法并循环遍历$a->getArray()
,但这不是我想要做的。谢谢。
答案 0 :(得分:1)
您可以实施Iterator
interface。为此,您需要在对象中实现几个方法,您可以将这些方法重定向到您的数组:
<?php
class A implements Iterator {
protected $array = [1,2,3];
public function __foriteration() {
return $this->array;
}
public function rewind()
{
reset($this->array);
}
public function current()
{
$value = current($this->array);
return $value;
}
public function key()
{
$key = key($this->array);
return $key;
}
public function next()
{
$value = next($this->array);
return $value;
}
public function valid()
{
$key = key($this->array);
return $key !== null && $key !== false;
}
}
$a = new A;
foreach($a as $value) {
echo $value;
}
当然,您可以实现自己的方法来跟踪“当前”项目,但由于数组已经执行了此操作,因此很容易让它为您执行此操作,而rewind
之类的方法只需调用数组函数。
答案 1 :(得分:0)
不是编写所有样板文件来使其成为可迭代对象,而是使用生成器:
class A {
protected $array = [1,2,3];
public function __foriteration() {
foreach($this->array as $value) {
yield $value;
}
}
}
$a = new A;
foreach($a->__foriteration() as $value) {
echo $value;
}