Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP静态变量内存使用率_Php - Fatal编程技术网

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:


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

      但是如果我们讨论的是内存使用,那么是的,如果你创建更多的对象,那么你复制变量,它将占用更多的内存,但是它的静态和非静态内存使用没有真正的变化

    • 你应该使用

      self::$DB

    • 访问静态变量(如
      $this
      在类范围内没有意义)

    • 应该对该类的所有对象共享的内容使用
      static

    • 您不应该使用构造函数中的参数来创建静态变量。这样,当您创建该类型的新对象时,静态变量将被覆盖


    • 静态变量是“类的属性”,而不是instance.Woah的属性。你链接到那里的答案太糟糕了。我还没有链接到任何答案。我把它与一个有很多答案的问题联系起来。通过投票对它们进行排序,它们描述了何时使用静态变量。我相信在这个话题上也会有其他的SO帖子。谢谢你的链接Ozair!我确实很公平地搜索了一下,但从来没有找到像这样的好线索。所以这与我的预期非常接近。因为我是单独编写代码而不是单元测试,所以我很难看到一些不好的编码习惯。谢谢你的澄清,我现在明白了。@PeeHaa-你可以用标准变量进行单元测试。只需保护它们,然后创建一个继承它们的类。在您可以测试的类中,您可以添加重置这些静态变量的功能。当它们在另一个类中使用时,您将如何模拟它们?你能说依赖注入就是好莱坞的原则吗?我的问题是我有一些全局设置/变量(例如数据库)。这个变量可以是使用变量的类中的默认值,但到目前为止,我只想到使用参数将DB对象传递给所有使用DB对象的不同类,这似乎是一种浪费。例如,如果我有一个用于身份验证、国际化和调试的类,并且希望所有这些类和主索引页都使用DB。除了将DB变量传递给构造函数之外,还有什么其他可能性呢?正如我所说的,您可以使用单例模式。通过使用这种设计实现您的数据库,您可以通过调用例如DB::query(..)或DB::getAll()在任何地方使用它。。请使用谷歌阅读关于单例模式的文章。