2014-10-01 90 views
0

我打算创建包含纯不可变数据的类,以及访问它的简单特征(或类,它不是重点)。因此,虚拟代码来说明我的意思:通过闭包访问私有静态属性 - 是否合理?

//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()方法人为地限制这种特质的使用情况如何?

对不起,如果我的问题是愚蠢的,在这种情况下,我也非常感谢建设性的批评。

+0

那么,你也只是可以声明你的属性为公开...(假设你有一些类似的机制来设置它们)。所以,这没有任何意义。 – bwoebi 2014-10-01 19:20:28

+0

如果你想直接访问它,那么没有太多要点属性'私人'。只需提供一个“公共”getter方法或使其本身成为public。 – Crackertastic 2014-10-01 19:23:40

+0

我希望实际上只读访问它,并且我想要一种统一的机制来完成它,因为可能会有很多'DataStorage'类。如果它只是一个getter方法,那么可能在不存在的变量上返回self ::就会引发警告。那么,也许我在这里确实感到困惑...... – Nevertheless 2014-10-01 19:37:17

回答

1

我不明白您的使用封闭的论证。无论如何,你可以重写它没有关闭。

class DataStorage { 
    use DataHandler; 
    static private $dataStorage = [ 
     'key' => 'data' 
    ]; 
    } 

trait DataHandler { 
    static public function get($property) { 
     return self::$dataStorage[$property]; 
     } 
    } 

echo DataStorage::get('key'); 

http://3v4l.org/FOTob#v540

附:最好避免使用静态值,它会给全局变量带来一些缺点,如紧耦合

0

OOP可见性有助于您通过对象封装来编写更好的系统。这不是防弹的。

这很难但并非不可能滥用。确定的个人 可以用任何语言编写垃圾代码。

Allen Holub

+0

那么为什么在Web上有这么多'Closure'用法的例子,比如php.net呢?我认为允许写意外的敏感数据可能更多是一种滥用...... – Nevertheless 2014-10-01 20:33:50

+0

从外部修改对象的私有属性是错误的。这是可能的,但错误的。 – Weltschmerz 2014-10-01 20:35:57

+0

这就是为什么我只想*以这种方式读*数据。 – Nevertheless 2014-10-01 20:37:58

相关问题