PHP静态变量内存使用率
我已经想了一段时间了,静态变量在内存使用方面是如何工作的,甚至应该真正考虑到这一点吗 我知道静态变量只会占用一个内存区域,不管类本身有多少个实例。所以从这个意义上说,使用静态变量进行明智的内存消耗也是明智的,对吗?但是我从来没有遇到过任何人谈论静态变量的内存使用情况(只有您可以与不同的实例共享数据) 例如:PHP静态变量内存使用率,php,Php,我已经想了一段时间了,静态变量在内存使用方面是如何工作的,甚至应该真正考虑到这一点吗 我知道静态变量只会占用一个内存区域,不管类本身有多少个实例。所以从这个意义上说,使用静态变量进行明智的内存消耗也是明智的,对吗?但是我从来没有遇到过任何人谈论静态变量的内存使用情况(只有您可以与不同的实例共享数据) 例如: class Something () { static $DB = null; __construct ($DB) { $this->DB = $DB;
class Something () {
static $DB = null;
__construct ($DB) {
$this->DB = $DB;
}
}
如果我创建这个类的10个实例,那么它将比使用非静态$DB变量产生更少的内存使用,对吗
如果是这样的话,效果是不是很小,这并不重要
那真的应该考虑吗
不,你不应该因为这个原因而担心static
s
您必须担心使用static
的原因是,您无法再对代码进行单元测试,并且您的类和代码与Something::DB
(即Something类)紧密耦合,并且您正在使用全局状态
还可以查看我之前关于如何处理这些“全局”实例的回答:是的,类的静态属性将存储在单个内存实例中 但是,在决定将变量作为静态变量时,这并不是一个问题。它们用于类级别的信息,例如保持类实例的计数 在何时使用静态变量时,查看以下Stackoverflow post:
- 你应该使用 self::$DB 访问静态变量(如
- 在您的情况下,请重新考虑您的软件设计。在使用静态变量的情况下,您正在尝试(如果不是,那么为什么需要静态?)从一个地方访问某些内容,而不重新创建它,就像使用单例模式创建db对象的单个实例一样
但是如果我们讨论的是内存使用,那么是的,如果你创建更多的对象,那么你复制变量,它将占用更多的内存,但是它的静态和非静态内存使用没有真正的变化
$this
在类范围内没有意义)
static
静态变量是“类的属性”,而不是instance.Woah的属性。你链接到那里的答案太糟糕了。我还没有链接到任何答案。我把它与一个有很多答案的问题联系起来。通过投票对它们进行排序,它们描述了何时使用静态变量。我相信在这个话题上也会有其他的SO帖子。谢谢你的链接Ozair!我确实很公平地搜索了一下,但从来没有找到像这样的好线索。所以这与我的预期非常接近。因为我是单独编写代码而不是单元测试,所以我很难看到一些不好的编码习惯。谢谢你的澄清,我现在明白了。@PeeHaa-你可以用标准变量进行单元测试。只需保护它们,然后创建一个继承它们的类。在您可以测试的类中,您可以添加重置这些静态变量的功能。当它们在另一个类中使用时,您将如何模拟它们?你能说依赖注入就是好莱坞的原则吗?我的问题是我有一些全局设置/变量(例如数据库)。这个变量可以是使用变量的类中的默认值,但到目前为止,我只想到使用参数将DB对象传递给所有使用DB对象的不同类,这似乎是一种浪费。例如,如果我有一个用于身份验证、国际化和调试的类,并且希望所有这些类和主索引页都使用DB。除了将DB变量传递给构造函数之外,还有什么其他可能性呢?正如我所说的,您可以使用单例模式。通过使用这种设计实现您的数据库,您可以通过调用例如DB::query(..)或DB::getAll()在任何地方使用它。。请使用谷歌阅读关于单例模式的文章。