2017-08-24 102 views
-1

我很难找到任何指南,所以我想我会问这里。在php类中迭代受保护的变量

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

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循环访问这些受保护的变量来遍历对象的属性。由于它们在传统意义上不“可见”,所以默认代码似乎不适用于此。经过一番研究后,我发现我可以实现迭代器来完成这样的事情,但所有的例子都是在特定对象上实现的。

我的目标是实现对我的“UnitObject”我的孩子继承迭代器,所以他们将财产通过对象的所有变量旋转当使用foreach循环写入所需的方法。所以我的问题如下:

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

谢谢!

+0

只是箱子正确制定者就像一个长大了,而不是滥用复杂的黑洞,是魔'__set'和'__get'。另外,后缀“object”是.. emm ...可疑的选择。 –

+0

问问自己,你是否真的需要**这种复杂性。为什么不只是有一个函数以数组的形式返回变量? – ryantxr

+0

感谢您的反馈,不幸的是,此功能是必需的。这是为更大的系统开发的框架的一部分。使用魔术函数可以控制范围,而无需为几百个不同的变量编写getter和setter。 – cast2022

回答

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 

这现在允许我对象致以抽象类遍历受保护的变量。