【问题标题】:Codeigniter design patternsCodeigniter 设计模式
【发布时间】:2013-01-31 06:21:20
【问题描述】:

我已经在 Codeigniter 上工作了几年,我只是想检查设计模式。我想在我的工作项目中实现不同的设计模式,以便更好地理解这些东西。

我知道 Codeigniter 遵循 MVC 模式,但 codeigniter 遵循哪种设计模式?

我们可以说一个database.php,一个数据库类正在实现一个单例设计模式吗?我的意思是,据我所知,在单例上,创建了一个提供全局访问的单个实例,这就是 CI 数据库配置对象所做的。

【问题讨论】:

  • 你的问题到底是什么?你想知道CI中每个班级的DP吗?或者您只是在问 DB 类?
  • CI中每个类的DP,以及它是否将任何DP作为一个整体使用

标签: php codeigniter design-patterns


【解决方案1】:

是的,Codeigniter 的加载器目前遵循单例模式,或者至少这是最准确地描述它的模式。当您执行以下操作时:

$this->load->library('foo');
$this->load->model('foo');
$this->load->database('foo');

加载器做了以下事情:

  • 通过检查已加载类的注册表来检查您正在加载的类是否之前已加载。如果请求已加载,请静默忽略带有调试日志条目的请求。

  • 使用您设置的任何参数来实例化该类,在以该类命名的框架(单例)超级对象中创建对该对象的引用,或者您传递的任何自定义名称。存储引用,忽略后续的加载尝试。

在引导时,加载器方法背后的全局范围内的魔术函数用于构造数据库、核心库等。

更传统的单例方法会做这样的事情(自动加载):

return $className::instance();

... 实例方法将返回一个实例,或者在尚未实例化的情况下进行构造,因此无需跟踪已加载或未加载的内容。如果类已加载,则将传递一个引用,否则将创建并返回一个新对象。

我想从技术上讲,CI 在这方面是它自己的模式,但足够接近单例,该术语确实适用。它确实是一个单例,只是没有以典型的方式实现。

最后,我检查了 CI-3 的补丁,这些补丁使加载程序更加灵活,允许在这些情况下通过返回对象或引用来随意在超级对象之外工作,但我没有不知道 Ellis Labs 的状态。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-20
    • 2013-08-27
    • 2012-04-14
    • 2011-11-30
    • 2010-12-28
    相关资源
    最近更新 更多