【发布时间】: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 循环时,他们将在该对象上的所有变量中进行属性轮换。所以我的问题如下:
- 实施迭代器是解决此问题的最佳技术吗?
- 是否可以使用实现迭代器的抽象父类并让该类包含所需的功能,或者我需要为每个特定对象创建所需的功能?
- 最后,如果可能的话,您能否提供一个示例,或者将我引向一个有很好示例的来源?
谢谢!
【问题讨论】:
-
只需像成年人一样培养适当的二传手,而不是滥用复杂性的黑洞,这是神奇的
__set和__get。此外,后缀“对象”是 .. emm ... 有问题的选择。 -
问问自己是否真的需要这种复杂性。为什么不只使用一个将变量作为数组返回的函数呢?
-
感谢您的反馈,很遗憾,此功能是必需的。这是正在为更大的系统开发的框架的一部分。使用魔术函数可以控制范围,而无需为数百个不同的变量编写 getter 和 setter。
-
你有三个不同的问题,你应该只有一个(否则太宽泛了)。您正在询问“最佳技术”,这是一个基于意见的问题。 (也是题外话)。第三个问题要求提供场外资源(也是题外话)。
标签: php oop iterator protected