单例模式中的普通成员属性相当于静态属性吗?
程序员文章站
2022-05-08 13:25:48
...
class Url {
private static $instance = null;
public $urls = array();
public static function getInstance() {
if (empty(self::$instance)) {
self::$instance = new self();
}
return self::$instance;
}
public function set() {
$this->urls = array(0, 1, 2, 3, 4, 5);
}
}
// 单例
$instance = Url::getInstance();
// 给普通成员属性赋值
$instance->set();
print_r($instance->urls); // 以后每次取都有值
print_r($instance->urls); // 同上
print_r($instance->urls); // 同上
回复内容:
class Url {
private static $instance = null;
public $urls = array();
public static function getInstance() {
if (empty(self::$instance)) {
self::$instance = new self();
}
return self::$instance;
}
public function set() {
$this->urls = array(0, 1, 2, 3, 4, 5);
}
}
// 单例
$instance = Url::getInstance();
// 给普通成员属性赋值
$instance->set();
print_r($instance->urls); // 以后每次取都有值
print_r($instance->urls); // 同上
print_r($instance->urls); // 同上
分两个层面
使用效果: 二者是一致的,可以说“相当于”
堆栈结构:完全不同
-
单例
是通过运行时代码保障只有一个实例,其所有成员变量都在实例空间内,落在堆区
,但是对于代码执行系统(php解释器、jvm)来说,它并不一定是单例的,通过反射机制,你可以突破单例限制创建出一个新的实例。和原来的实例存放在堆区不同的地方,操作其中一个实例的成员变量,不影响另一个。 - 而非单例的
静态成员
,和所有类的方法定义,属于对于类
(而不是实例)来说固定不变的内容,统统放在方法区
,无论如何,你都变不出第二份出来。这个类的所有实例,共享这些静态变量,即使没有实例,也可以直接通过类名来访问。
也可以这么认为,因为只有一个实例。
单例就是把一堆全局变量封装在一个全局对象中而已。使用单例而不是使用静态成员,主要是为了便于扩展。