2017-08-24 105 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 

這現在允許我對象致以抽象類遍歷受保護的變量。