自动加载或文件搜索


Autoload or File Search

我正在构建一个OpenCart的分支,涉及一些非常重的核心功能重写,包括允许覆盖核心的专用主题,类似于Wordpress主题系统。

如果给定的控制器、模型或语言文件存在于主题中,则使用它们,否则使用核心文件。

我目前正在自动加载所有的系统文件,这工作得很好。但我想知道如果它也自动加载我所有的控制器,模型和语言文件会更好吗?

我注意到(即使在OpenCart中)通过文件系统搜索相同的文件,并加载多次。(特别是模型和语言)

自动加载所有这些文件,然后简单地实例化现有的类,而不是每次搜索文件,然后使用include,这不是更有效吗?

让我举个例子…

我的主页包含以下模块:

幻灯片,最新的产品,主打产品,旋转木马

这个与页眉和页脚控制器一起最终调用:

$this->load->model('catalog/product');

23倍。

这是使用文件系统搜索同一文件的23倍。当然还有其他所有被调用的模型。

所以我想问题更多的是关于开销…

是自动加载(和缓存)所有文件而不管它们是否被调用,还是搜索文件系统并根据需要为每个文件做包含更昂贵?

我相信这是一个古老的问题,但我还没有看到一个明确的答案。

和BTW的答案都很好,我只是想在我的代码中尽可能高效。

好吧,我明白你的意思,但说实话,只有在你可以证明响应时间因为这个原因而变慢的情况下,你才应该关心这个问题。在有了这样的证明(这是相对于服务器的硬件,连接速度,无论是晴天还是暴风雨天气,白天还是晚上)之后,您可以使用github存储库发布错误和补丁修复。

现在模型加载执行file_exists检查,然后是include_once,然后它实例化一个新的模型对象,同时设置(或替换)它作为注册表中的某个键。当前代码看起来像这样(system/engine/loader.php):

public function model($model) {
    $file  = DIR_APPLICATION . 'model/' . $model . '.php';
    $class = 'Model' . preg_replace('/[^a-zA-Z0-9]/', '', $model);
    if (file_exists($file)) { 
        include_once($file);
        $this->registry->set('model_' . str_replace('/', '_', $model), new $class($this->registry));
    } else {
        trigger_error('Error: Could not load model ' . $model . '!');
        exit();                 
    }
}

通过稍微修改,我们可以改进这段代码,只执行一个file_exists检查,只有一个include_once,只有一个模型的对象:

public function model($model) {
    $key = 'model_' . str_replace('/', '_', $model);
    if (!$this->registry->has($key)) {
        $file  = DIR_APPLICATION . 'model/' . $model . '.php';
        $class = 'Model' . preg_replace('/[^a-zA-Z0-9]/', '', $model);
        if (file_exists($file)) { 
            include_once($file);
            $this->registry->set($key, new $class($this->registry));
        } else {
            trigger_error('Error: Could not load model ' . $model . '!');
            exit();                 
        }
    }
}

你现在可以花一些时间调试原始代码和修复的代码,看看这是否带来了如此大的改进:-)

编辑:无论哪种方式,我都会检查如何在OpenCart 2.0中处理和完成(在它的最新状态中,因为它到目前为止还没有准备好发布),并仅在以同样的方式完成时提交问题。