我最近一直在研究如何最好地组织我的库/课程,但我还没有提出一个令人满意的解决方案。这样一来,编写$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_map在APPPATH下的任何位置查找具有相应名称(例如XyzImplementation.php)的类。听起来很可怕,对吧?一旦找到XyzImplementation.php,它的位置就被缓存在一个文件中,并在下一次查找,所以一旦站点/应用程序通过了一些测试,没有理由不每个实例化都是一个查找。
这听起来像是半个像样的解决方案吗?假设find_class_path使用递归目录查找返回找到的类文件的完整相对路径。
// 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;
}发布于 2011-05-15 12:47:48
我不是CodeIgniter的开发人员,所以我无法解释为什么他们不使用__autoload或spl_autoload_register。然而,我可以想出几个原因来解释为什么我可能不会:
至于自动加载类的实现,假设所有使用的类都缓存在缓存文件中。您正在向您执行的每个类实例化添加额外的IO请求和未分配的内存使用。如果您认为您的应用程序将达到企业级,那么这种开销可能会回来找您。在你变大之前考虑一下这些事情是很好的,这将为你以后省去心痛和金钱。
老实说,我没有发现CodeIgniter处理类实例化的方式有什么问题。我同意使用PHP更适合单例模式的使用,但是如果你需要实例化一个类的实例,比如说一个person对象,那么为什么不像任何普通的CodeIgniter类一样包含它呢?事实上,如果您出于与模型相关的原因进行实例化,为什么不使用一个优秀的ORM框架呢?
https://stackoverflow.com/questions/6006106
复制相似问题