我有一个理解问题:
singleton设计模式使用静态函数调用,如singleton::getInstance(),在该函数中使用静态变量,如self::$_instance。
根据定义,静态函数和变量与任何具体实例无关,每次都只是为了特定调用的目的而被调用。那么,任何值都可以存储在这样的准抽象中,并且每次都是新创建的"对象",这怎么可能呢?
希望你能理解我的问题。
静态属性类似于全局变量。只是视觉上的差异。全局变量可以作为公共静态属性由每个人更改,但私有或受保护的静态属性的可见性较低。
想象那个类实际上是一个在定义时创建的对象,并且只能存在于一个实例中。静态属性和方法就是这个"对象"的属性和方法。这就是为什么很多人不理解带有静态成员的常规类和singleton之间的区别。
可见性、静态、单例模式
该属性是静态的,因此可以从静态方法访问。然而,底层对象是一个真实的、活动的实例。从静态方法中,不能使用$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
}
}
有三件事使类成为Singleton,否则它将成为一个普通类。
- 静态变量
- 静态方法
- 私有构造函数
也许您已经为计数器功能创建了一个类,Singleton也是如此。