0

在 codeigniter 框架中有一个这样的类(我将它编辑得更清楚,完整的功能在这里http://pastebin.com/K33amh7r):

function &load_class($class, $directory = 'libraries', $prefix = 'CI_')
    {
        static $_classes = array();

        // Does the class exist?  If so, we're done...
        if (isset($_classes[$class]))
        {
            return $_classes[$class];
        }


        is_loaded($class);

        $_classes[$class] = new $name();
        return $_classes[$class];

    }

所以,第一次加载类时(传递给这个函数),它将被保存到这个静态变量中。下次加载同一个类时,此函数会检查该类是否已经存在(如果它已经分配给静态,缓存,我不确定它是如何存储在内存中的),如果它存在,则加载它(NOT *实例化*再次 )

据我所知,唯一的目的是节省时间或内存,而不是两次实例化同一个类。

我的问题是:真的实例化一个类会占用内存或消耗加载时间,所以它必须像这样被缓存吗?

4

3 回答 3

4

CodeIgniter 适用于快速原型设计,几乎在任何情况下都不是企业模式的好例子。这种行为与他们对“控制器”与几乎所有其他对象的关系的设计选择有关;即几乎任何东西都只有一个(只有一个控制器实例,每个库只有一个实例,等等)。这种设计选择更适合快速开发(由开发人员“不必跟踪太多”或类似的东西证明是合理的......)。

基本上,通过不实例化对象可以节省内存(存储对象的实例变量所需的内存),如果对象的构造函数尝试做很多工作,您也可以节省时间。

然而,单例命令式的适当性显然不是普遍的;有时你真的想要一个新的实例。当你能证明这一点时,选择一个更好的框架。

于 2012-08-26T00:44:40.190 回答
1

实例化类所用的资源和时间通常可以忽略不计。我通常看到使用单例类的主要原因是维护数据完整性。例如,如果您有一个表示数据库中数据的类,为它创建多个对象可能会导致数据不同步。如果一个对象更改并将数据提交到数据库,则其他对象可能具有旧数据。

于 2012-08-26T00:46:06.947 回答
0

它是一个相当简单的概念,利用单例模式确保一个类在应用程序的执行周期中只实例化一次。

这种概念更适用于图书馆。让我们看一个基本的例子:

class Authenticate {
     public function login($username, $password) {
        ....
     }

     public function logout() {

     }
}

现在,通过一个页面的执行,几乎没有任何情况需要多次创建上述类的对象。主要要了解的是资源的利用

的,一遍又一遍地实例化同一个类毫无疑问会在内存中加起来,虽然它可能像我展示的例子一样可以忽略不计,但它确实会影响。

于 2012-08-26T01:07:21.883 回答