【发布时间】:2014-11-26 17:34:22
【问题描述】:
我打算创建包含纯不可变数据的类,以及访问它的简单特征(或类,这不是重点)。所以,用虚拟代码来说明我的意思:
//Data class
class DataStorage
{
use DataHandler;
static private $dataStorage = [
'key' => 'data'
];
}
获取数据的特征:
//Data getter
trait DataHandler
{
static public function get($property)
{
$func = function() use($property) {
return self::$dataStorage[$property];
};
$obtain = Closure::bind($func, NULL, get_class());
return $obtain();
}
}
如您所见,Closure 用于获取私有数据,它非常简单,符合我的要求。但是,这种方法似乎有些危险。看起来我可以访问 ANY 类的 ANY 静态私有属性。
Q1:是否违反 OOP 原则?
Q2:通过使DataStorage 类实现一些接口并在DataHandler::get() 方法中检查它来人为限制此特征的使用是否是一个好的解决方案?
对不起,如果我的问题很愚蠢,在这种情况下,我也非常感谢建设性的批评。
【问题讨论】:
-
好吧,那么你也可以将你的属性声明为公共的......(假设你有一些类似的机制来设置它们)。所以,这没有任何意义。
-
如果您想直接访问它,那么创建属性
private并没有多大意义。只需提供publicgetter 方法或将属性设置为public本身。 -
我想要只读访问它,实际上,我想要一种统一的机制来做到这一点,因为可能有很多
DataStorage类。如果它只是一个 getter 方法,那么不存在变量上的return self::可能会引发警告。好吧,也许我确实在这里感到困惑...... -
我认为只读数据是即时进入的,这就是你不使用常量的原因,是吗?
-
是的,这是原因之一。此外,将数组或对象存储在常量中是不合适的。