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

发布于 2022-08-31 20:50:57 字数 562 浏览 13 评论 0

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

烟─花易冷 2022-09-07 20:50:57

分两个层面

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

堆栈结构:完全不同

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

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

陈独秀 2022-09-07 20:50:57

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文