实例化多个对象会消耗大量内存吗?


Will instantiating multiple object consume much of memory?

我在php中使用OOP方法。不过我还在学习。每次需要访问类中的方法时,我都会实例化一个对象。所以我在我的项目中创建了相当多的对象来完成每个任务。是否有一种方法,我只能在整个项目中创建一个对象和共享,为不同的任务做多种方法?

同样在我的类中,我先声明变量,然后像$this->property = $assign_variable一样使用它们。更早声明变量会消耗内存吗?

我只是关心如何在OOP中正确有效地实例化对象和声明类。有人能给点建议吗?

拥有一个对象的多个实例会消耗更多的内存(much是相对的),因为对象的每个属性都需要分配内存。如果你有一个对象为它的属性消耗了x字节的内存,那么如果你总共实例化n个对象,你将需要n*x字节的内存(还有一个可以忽略不计的内存量需要用于代码,但这个量是恒定的)。在正常使用中,这应该不是一个问题(例如,如果你没有异常大量的对象)。

如果你在整个程序中只需要一个类的实例,我建议你使用单例设计模式1]

下面是一个例子:

class Singleton {
    // This is where the one and only instance is stored
    private static $instance = null;
    private __construct() {
        // Private constructor so the class can't be initialized
    }
    // That's how you get the one and only instance
    public static function getInstance() {
        if (Singleton::$instance === null) {
            Singleton::$instance = new Singleton();
        }
        return Singleton::$instance;
    }
    public function doSomething() {
        // here you can do whatever you need to do with the one and only object of this class
    }
}

你可以像这样方便地使用它:

Singleton::getInstance()->doSomething();

所以你基本上只是将对象的地址存储在一个位置,即Singleton::$instance

另一个选择是使用静态方法。它在单例模式中的定义与上面类似:

class StaticExample {
    // ...
    public static function doSomething() {
        // your code
    }
}

可以用StaticExample::doSomething();

访问

我还想指出,通常情况下,在实现单例设计模式或经常使用static关键字的项目中,您不会有太多的类。如果你想使用大量的单例,或者看到自己需要大量的static,你可能犯了一些错误,应该在另一个网站上发布你的代码示例,如程序员堆栈交换。

1]维基百科的单例设计模式