我很难找到任何指南,所以我想我会在这里问。
我有对象,这些对象都有受保护的变量。这些变量是受保护的,因为我希望它们可读,但只有一些可写,我想在它们设置时过滤它们。为了实现这一点,我创建了以下类,从中扩展了适合此设计的所有其他类:
abstract class UnitObject{
protected $setables = [];
abstract public function filter($value);
public function __set($name, $value)
{
if ( in_array($name, $this->setables) ) {
$this->{$name} = $this->filter($value);
} else {
/*
* Log something
*/
}
}
public function __get($name)
{
return $this->{$name};
}
}
现在这正在实现预期的结果。但是,我希望通过foreach循环访问这些受保护的变量,以迭代对象的属性。由于它们在传统意义上不是“可见的”,因此默认代码似乎不适用于此。经过一些研究,我发现我可以实现Iterator来完成这样的事情,但所有的例子都是我在特定对象上实现的。
我的目标是在我的孩子继承的“UnitObject”上实现迭代器,并编写所需的方法,以便在使用foreach循环时,属性可以旋转该对象上的所有变量。所以我的问题如下:
谢谢!
答案 0 :(得分:0)
/*
* Functions to allow protected and private variables to be iterated over
*/
private $variablePosition = 0;
private $variableArray = [];
public function rewind()
{
$this->variableArray = array_keys(get_object_vars($this));
$this->variablePosition = 0;
}
public function current()
{
return $this->{$this->key()};
}
public function key()
{
return $this->variableArray[$this->variablePosition];
}
public function next()
{
++$this->variablePosition;
}
public function valid()
{
return isset($this->variableArray[$this->variablePosition]);
}
*Note: I also had to implement Iterator on my UnitObject class
现在允许扩展我的抽象类的对象迭代受保护的变量。