【问题标题】:Singleton: How does static variable $instance store dataSingleton:静态变量$instance如何存储数据
【发布时间】:2013-07-03 10:55:09
【问题描述】:

我有一个理解问题:

单例设计模式使用像 Singleton::getInstance() 这样的静态函数调用,在这个函数中它使用像 self::$_instance 这样的静态变量。

根据定义,静态函数和变量独立于任何具体实例,并且每次都被调用,只是为了它的特定调用。那么怎么可能,任何值都可以存储在这样的准抽象和每次新创建的“对象”中?

希望你能理解我的问题。

【问题讨论】:

    标签: php design-patterns static singleton


    【解决方案1】:

    静态属性类似于全局变量。差异仅在于其可见性。每个人都可以将全局变量作为公共静态属性进行更改,但私有或受保护的静态属性的可见性较低。

    想象一下,类实际上是一个在定义时创建的对象,并且只能存在于一个实例中。静态属性和方法是这个“对象”的属性和方法。这就是为什么很多人不理解具有静态成员的常规类和单例之间的区别。

    Visibilitystaticsingleton pattern

    【讨论】:

    • 所以类本身可以被视为(实例化的)对象?这很令人困惑,因为每个定义的类应该只是从它派生的实例的“模板”。
    【解决方案2】:

    Singleton 设计(anti-)pattern 允许确保最多创建一个实例。

    该属性是静态的,因此可以从静态方法访问它。然而,底层对象是一个真实的、活动的实例。从静态方法中,你不能使用$this,但你可以引用任何已经实例化的对象,self::$_instance恰好是)

    class SingletonClass {
    
        private static $_instance;
        private $_someProperty;
    
        public static function getSomeProperty() {
            return self::$_instance->_someProperty; // allowed, self::$_instance is static, but a real object nonetheless
        }
    
    }
    

    【讨论】:

    • 它不是单例,因为您的 __construct 方法仍然打开。
    【解决方案3】:

    三件事使类成为单例类,否则它将成为普通类。

    1. 静态变量
    2. 静态方法
    3. 私有构造函数

    可能你已经为计数器功能创建了一个类,Singleton 是一样的。

    【讨论】:

    • 类不需要所有这些,你可以使用依赖注入并指定注入器只返回类的相同实例的对象的生命周期。这也是一个单例。
    猜你喜欢
    • 2013-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-16
    相关资源
    最近更新 更多