4

我一直想知道静态变量在内存使用方面是如何工作的,甚至应该考虑吗?

我知道静态变量只会占用一个内存区域,与类本身有多少实例无关。所以从这个意义上说,使用静态变量来消耗内存也应该是明智的,对吧?但我从未偶然发现有人谈论静态变量的内存使用情况(只是你可以与不同的实例共享数据)。

例如:

class Something () {
    static $DB = null;
    __construct ($DB) {
        $this->DB = $DB;
    }
}

如果我要创建 10 个此类的实例,那么与使用非静态 $DB 变量相比,它会产生更少的内存使用量,对吧?

而如果是这样的话,是不是影响那么小,真的无所谓吗?

4

4 回答 4

3

甚至应该真正考虑到这一点吗?

static不,您不应该为此担心s 。

您必须担心使用的static原因是您无法再对代码进行单元测试,并且您拥有紧密耦合的类和代码Something::DB(即Something 类)并且您正在使用全局状态。

另请查看我之前关于如何处理这些“全局”实例的回答:在函数中访问配置的最佳实践是哪个?

于 2012-07-25T09:41:45.510 回答
2

在您的情况下,请重新考虑您的软件设计。在使用静态变量的情况下-您正在尝试(如果不是,那为什么需要静态变量?)使某些东西可以从一个地方访问,而无需重新创建它,例如使用单例模式来制作 db 对象的单个实例。

但是,如果我们谈论的是内存使用情况,那么是的,如果您将创建更多对象,那么您会复制变量 - 这将占用更多内存,但是关于其静态与否的内存使用情况并没有真正的变化。

于 2012-07-25T09:45:22.103 回答
1

是的,类的静态属性将存储在单个内存实例中。

但是,在决定将变量设为静态时,这不是问题。它们用于类级别信息,例如保持类实例的计数。

阅读以下有关何时使用静态变量的 Stackoverflow 帖子:

于 2012-07-25T09:42:39.830 回答
0
  1. 你应该使用

    自我::$DB

访问静态变量($this在类范围的上下文中没有意义)

  1. 应该static用于该类的所有对象共享的东西。

  2. 您不应使用构造函数中的参数来创建静态变量。这样做会在您创建该类型的新对象时覆盖静态变量

于 2012-07-25T09:47:37.280 回答