几年来我一直在研究Codeigniter,我只是想检查设计模式。我想在我的工作项目中实现不同的设计模式,这样我就可以更好地理解这些东西。
我知道Codeigniter遵循MVC模式,但codeigniter遵循哪种设计模式?
我们可以说一个database.php,一个数据库类正在实现一个单例设计模式吗?我的意思是,据我所知,在单例上,创建了一个提供全局访问的单个实例,这就是 CI 数据库配置对象所做的。
几年来我一直在研究Codeigniter,我只是想检查设计模式。我想在我的工作项目中实现不同的设计模式,这样我就可以更好地理解这些东西。
我知道Codeigniter遵循MVC模式,但codeigniter遵循哪种设计模式?
我们可以说一个database.php,一个数据库类正在实现一个单例设计模式吗?我的意思是,据我所知,在单例上,创建了一个提供全局访问的单个实例,这就是 CI 数据库配置对象所做的。
是的,Codeigniter 的加载器目前遵循单例模式,或者至少这是最准确地描述它的模式。当您执行以下操作时:
$this->load->library('foo');
$this->load->model('foo');
$this->load->database('foo');
加载程序执行以下操作:
通过检查已加载类的注册表来检查您正在加载的类是否之前已加载。如果已加载,则使用调试日志条目静默忽略该请求。
使用您设置的任何参数实例化该类,在以该类命名的框架(单例)超级对象中创建对该对象的引用,或者您传递的任何自定义名称。存储引用,忽略后续的加载尝试。
在引导程序中,加载器方法背后的全局范围内的魔术函数用于构建数据库、核心库等。
更传统的单例方法会做这样的事情(自动加载):
return $className::instance();
...实例方法将返回一个实例,或者在尚未实例化的情况下构造,因此无需跟踪已加载或未加载的内容。如果类已加载,则将传递一个引用,否则将创建并返回一个新对象。
我想从技术上讲,CI 在这方面是它自己的模式,但足够接近单例,该术语确实适用。它确实是一个单例,只是没有以典型的方式实现。
最后,我检查了 CI-3 的补丁,这些补丁使加载程序更加灵活,允许在这些情况下通过返回对象或引用来随意在超级对象之外工作,但我不知道Ellis Labs 的状态。