• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

单例模式中的普通成员属性相当于静态属性吗?

php 搞代码 4年前 (2022-01-25) 21次浏览 已收录 0个评论
文章目录[隐藏]
<code>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);    // 同上</code>

回复内容:

<code>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);    // 同上</code>

分两个层面

使用效果: 二者是一致的,可以说“相当于”

堆栈结构:完全不同

  1. 单例是通过运行时代码保障只有一个实例,其所有成员变量都在实例空间内,落在堆区,但是对于代码执行系统(php解释器、jvm)来说,它并不一定是单例的,通过反射机制,你可以突破单例限制创建出一个新的实例。和原来的实例存放在堆区不同的地方,操作其中一个实例的成员变量,不影响另一个。
  2. 而非单例的静态成员,和所有类的方法定义,属于对于(而不是实例)来说固定不变的内容,统统放在方法区,无论如何,你都变不出第二份出来。这个类的所有实例,共享这些静态变量,即使没有实例,也可以直接通过类名来访问。

也可以这么认为,因为只有一个实例。

8本文来源gao.dai.ma.com搞@代*码(网$

搞代gaodaima码

单例就是把一堆全局变量封装在一个全局对象中而已。使用单例而不是使用静态成员,主要是为了便于扩展。


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:单例模式中的普通成员属性相当于静态属性吗?
喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址