首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么CodeIgniter不使用`__autoload()` (或`spl_autoload_register`)

为什么CodeIgniter不使用`__autoload()` (或`spl_autoload_register`)
EN

Stack Overflow用户
提问于 2011-05-15 10:24:55
回答 1查看 1.2K关注 0票数 2

我最近一直在研究如何最好地组织我的库/课程,但我还没有提出一个令人满意的解决方案。这样一来,编写$xyz = new XyzImplementation()要比编写$xyz = $this->load->library('xyz_implementation')干净得多。对于多个实例,情况只会变得更糟,它似乎非常倾向于将库/模型作为单例使用。

为什么CodeIgniter不直接使用spl_autoload_register__autoload()本身呢?我知道CI知道它的类文件在哪里,所以不一定需要在每次实例化一个类时都去查找。这仅仅是速度的问题吗?和/或保持它的轻量级?如果是这样的话,我想知道给CI提供这种功能最好的方法是什么,比如$xyz = new XyzImplementation()

我尝试过HMVC,但我不喜欢它基本上废弃了核心CI_Loader并重新实现每个函数的事实。我想知道如果核心方法的内容发生变化会发生什么。我猜任何使用HMVC的人都必须等待它的补丁(或者在github上自己打补丁)。

我今晚已经想出了我自己的解决方案,但我不确定它是否都那么有效。它基本上使用directory_mapAPPPATH下的任何位置查找具有相应名称(例如XyzImplementation.php)的类。听起来很可怕,对吧?一旦找到XyzImplementation.php,它的位置就被缓存在一个文件中,并在下一次查找,所以一旦站点/应用程序通过了一些测试,没有理由不每个实例化都是一个查找。

这听起来像是半个像样的解决方案吗?假设find_class_path使用递归目录查找返回找到的类文件的完整相对路径。

代码语言:javascript
复制
// ignore system classes
if('CI' === substr($name, 0, 2) || 'MY' === substr($name, 0, 2))
{
    return;
}

// read cache
$cache = array();
$cache_file = APPPATH.'cache/abracadabra.php';
$class_in_cache = false;
if(file_exists($cache_file))
{
    $cache_contents = file_get_contents($cache_file);
    if(!empty($cache_contents))
    {            
        $cache = unserialize($cache_contents);
        if(array_key_exists($name, $cache))
        {
            $class_in_cache = true;
            include_once($cache[$name]);
        }
    }
}

// class not in cache, find it in application
if(!$class_in_cache)
{
    // TODO be more restrictive than APPPATH
    $class_path = find_class_path($name, APPPATH);
    // TODO handle case where a class isn't found
    $cache[$name] = $class_path;
    file_put_contents($cache_file, serialize($cache)); // add to cache
    include_once $class_path;
}

// instantiate
if(class_exists($name)) // so as to not instantiate interfaces
{
    return new $name;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-05-15 12:47:48

我不是CodeIgniter的开发人员,所以我无法解释为什么他们不使用__autoloadspl_autoload_register。然而,我可以想出几个原因来解释为什么我可能不会:

  • 某些操作码缓存不支持自动加载。对于将在生产中的各种服务器上使用的产品,这将是一个疏远的错误,并可能导致大量的性能影响,其中,速度是加载的一个关键吸引力$ CodeIgniter.
  • Using ->库(‘身份验证’)语法将允许更有效地区分加载的确切内容,无论是帮助器、库、模型等,我认为这会使您的代码更容易阅读。

至于自动加载类的实现,假设所有使用的类都缓存在缓存文件中。您正在向您执行的每个类实例化添加额外的IO请求和未分配的内存使用。如果您认为您的应用程序将达到企业级,那么这种开销可能会回来找您。在你变大之前考虑一下这些事情是很好的,这将为你以后省去心痛和金钱。

老实说,我没有发现CodeIgniter处理类实例化的方式有什么问题。我同意使用PHP更适合单例模式的使用,但是如果你需要实例化一个类的实例,比如说一个person对象,那么为什么不像任何普通的CodeIgniter类一样包含它呢?事实上,如果您出于与模型相关的原因进行实例化,为什么不使用一个优秀的ORM框架呢?

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6006106

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档