我已经想知道静态变量在内存使用方面是如何工作的了,是否应该真正考虑这一点?
我知道静态变量只会占用一个内存区域,而不管类本身有多少实例。因此,从这个意义上说,使用静态变量进行明智的内存消耗也是明智的,对吧?但我从未偶然发现有人在谈论静态变量的内存使用(只是你可以与不同的实例共享数据)。
例如:
class Something () {
static $DB = null;
__construct ($DB) {
$this->DB = $DB;
}
}
如果我要创建这个类的10个实例,那么它将比使用非静态$DB变量产生更少的内存使用,对吧?
如果是这样,效果那么小吗?
这真的应该考虑吗?
不,你不应该因为这个原因而担心static
。
您必须担心使用static
的原因是,您无法再对代码进行单元测试,并且您有与Something::DB
(即Something类)紧密耦合的类和代码,并且您正在使用全局状态。
还可以看看我之前关于如何处理这些"全局"实例的回答:访问函数内部配置的最佳做法是什么?
在您的情况下,请重新考虑您的软件设计。在使用静态变量的情况下,您正在尝试(如果不是,那么为什么需要静态?)从一个地方访问一些东西,而不重新创建它,比如使用Singleton模式来创建db对象的单个实例。
但是,如果我们谈论的是内存使用,那么是的,如果你要创建更多的对象,那么你要复制变量——这将占用更多的内存,但内存使用的静态与否并没有真正的变化。
是的,类的静态属性将存储在单个内存实例中。
但是,在决定将变量设为静态时,这并不是一个问题。它们用于类级别的信息,例如保持类实例的计数。
浏览以下关于何时使用静态变量的Stackoverflow帖子:
- 我什么时候在php中使用静态变量/函数
-
你应该使用
self::$DB
访问静态变量(因为$this
在类范围的上下文中没有意义)
-
应该对该类的所有对象共享的内容使用
static
。 -
您不应该使用构造函数中的参数来创建静态变量。这样,当你创建一个类型的新对象时,静态变量会被覆盖