迭代php类中的受保护变量

时间:2017-08-24 21:55:44

标签: php oop iterator protected

我很难找到任何指南,所以我想我会在这里问。

我有对象,这些对象都有受保护的变量。这些变量是受保护的,因为我希望它们可读,但只有一些可写,我想在它们设置时过滤它们。为了实现这一点,我创建了以下类,从中扩展了适合此设计的所有其他类:

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循环时,属性可以旋转该对象上的所有变量。所以我的问题如下:

  1. 实现迭代器是解决此问题的最佳技术吗?
  2. 是否可以使用实现Iterator的抽象父类并使该类包含所需的函数,还是需要为每个特定对象创建所需的函数?
  3. 最后,如果可能的话,你能提供一个例子,或者将我引导到一个有很好例子的来源吗?
  4. 谢谢!

1 个答案:

答案 0 :(得分:0)

ryantxr,谢谢你实际上非常接近我需要做的事情。在使用迭代器实现变得更有能力之后,我找到了一个解决方案。这是我添加到UnitObject抽象类的代码:

    /*
     * 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

现在允许扩展我的抽象类的对象迭代受保护的变量。