通过Closures访问私有静态属性 - 这是理性的吗?

时间:2014-10-01 19:10:42

标签: php oop closures

我打算创建包含纯不可变数据的类,以及访问它的简单特征(或类,它不是重点)。所以,虚拟代码来说明我的意思:

//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()方法中检查它来人为地限制此特征的使用是否是一个很好的解决方案? / p>

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

2 个答案:

答案 0 :(得分:1)

我无法理解你使用闭包的论证。无论如何,你可以在没有Closure的情况下重写它。

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

P.S。避免使用静态值会更好,它会带来一些全局变量的缺点,比如紧耦合

答案 1 :(得分:0)

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

  

虐待更难,但并非不可能。坚定的个人   可以用任何语言编写垃圾代码。

     

Allen Holub