【问题标题】:Accesing private static properties via Closures - is it rational?通过闭包访问私有静态属性——合理吗?
【发布时间】: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 并没有多大意义。只需提供 public getter 方法或将属性设置为 public 本身。
  • 我想要只读访问它,实际上,我想要一种统一的机制来做到这一点,因为可能有很多 DataStorage 类。如果它只是一个 getter 方法,那么不存在变量上的 return self:: 可能会引发警告。好吧,也许我确实在这里感到困惑......
  • 我认为只读数据是即时进入的,这就是你不使用常量的原因,是吗?
  • 是的,这是原因之一。此外,将数组或对象存储在常量中是不合适的。

标签: php oop closures


【解决方案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

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

【讨论】:

    【解决方案2】:

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

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

    Allen Holub

    【讨论】:

    • 那么为什么在 Web 上,比如 php.net 上会有这么多 Closure 用法的例子呢?我认为允许意外向敏感数据写入内容可能更像是一种滥用......
    • 从外部修改对象的私有属性是错误的。这是可能的,但是错了。
    • 对不起,我的意思是访问私有财产……或任何私有的东西。这就是私人的全部意义。
    • 那么我不明白类中常见的 get/set 方法(在许多指南中提到并在许多系统中实现),实际上允许您访问私有属性。
    猜你喜欢
    • 1970-01-01
    • 2012-03-30
    • 1970-01-01
    • 2016-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-25
    相关资源
    最近更新 更多