【问题标题】:Iterate over protected variables in a php class遍历 php 类中的受保护变量
【发布时间】:2018-02-02 22:05:14
【问题描述】:

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

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

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. 是否可以使用实现迭代器的抽象父类并让该类包含所需的功能,或者我需要为每个特定对象创建所需的功能?
  3. 最后,如果可能的话,您能否提供一个示例,或者将我引向一个有很好示例的来源?

谢谢!

【问题讨论】:

  • 只需像成年人一样培养适当的二传手,而不是滥用复杂性的黑洞,这是神奇的__set__get。此外,后缀“对象”是 .. emm ... 有问题的选择。
  • 问问自己是否真的需要这种复杂性。为什么不只使用一个将变量作为数组返回的函数呢?
  • 感谢您的反馈,很遗憾,此功能是必需的。这是正在为更大的系统开发的框架的一部分。使用魔术函数可以控制范围,而无需为数百个不同的变量编写 getter 和 setter。
  • 你有三个不同的问题,你应该只有一个(否则太宽泛了)。您正在询问“最佳技术”,这是一个基于意见的问题。 (也是题外话)。第三个问题要求提供场外资源(也是题外话)。

标签: php oop iterator protected


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2017-01-12
    • 2023-04-09
    • 1970-01-01
    • 2014-05-14
    • 2011-06-06
    • 2020-03-29
    • 2011-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多