我一直想知道静态变量在内存使用方面是如何工作的,是否真的应该考虑?
我知道静态变量只会耗尽一个内存区域,无论该类本身有多少个实例。所以在这个意义上,使用静态变量进行明智的内存消耗应该是明智的,对吧?但是,我从来没有偶然发现任何人谈论静态变量的内存使用情况(只有你可以用不同的实例共享数据)。
例如:
class Something () {
static $DB = null;
__construct ($DB) {
$this->DB = $DB;
}
}
如果我要创建这个类的10个实例,那么它会产生比非静态$ DB变量更少的内存使用量,对吗?
如果是这样,效果是如此之小,那真的不重要吗?
答案 0 :(得分:3)
甚至应该真的考虑过吗?
不,你不应该因为这个原因而担心static
。
您必须担心使用static
的原因是您无法对代码进行单元测试,并且您已将类和代码紧密耦合到Something::DB
(即Something类)和你正在与全球国家合作。
另请查看我之前关于如何处理这些“全局”实例的答案:Which is the best practice to access config inside a function?
答案 1 :(得分:2)
在您的情况下,请重新考虑您的软件设计。在使用静态变量的情况下 - 您正在尝试(如果不是,那么为什么需要静态?)来从一个地方访问某些内容,而无需重新创建它,就像使用Singleton模式生成db对象的单个实例一样。
但是如果我们谈论内存使用,那么是的,如果你要创建更多的对象,那么你复制变量 - 它将需要更多的内存,但是关于它的静态或不是内存使用没有真正的变化。 / p>
答案 2 :(得分:1)
是的,类的静态属性将存储在单个内存实例中。
但是,在将变量作为静态做出决定时,这不是一个问题。它们用于类级别信息,例如保持类实例的计数。
关于何时使用静态变量,请阅读以下Stackoverflow文章:
答案 3 :(得分:0)
您应该使用
自:: $ DB
访问静态变量(因为$this
在类范围上下文中没有意义)
应该使用static
来表示该类所有对象共享的内容。
您不应该使用构造函数中的参数来创建静态变量。这样做时,当您创建该类型的新对象时,静态变量会被覆盖