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