Codeigniter设计模式

8

我已经在使用Codeigniter几年了,想要了解一些设计模式。我希望能够在我的工作项目中实现不同的设计模式,以便更好地理解这些内容。

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

我们能否说database.php中的database类正在实现单例设计模式?我这么说是因为据我所知,单例模式创建了一个单一实例,提供全局访问,这正是CI数据库配置对象所做的。


你的问题是什么?你想知道CI中每个类的DP吗?还是只询问DB类? - mamdouh alramadan
每个 CI 类的 DP,以及它是否作为整体使用任何 DP - hsuk
可能是Codeigniter使用了哪种设计模式?的重复问题。 - Imran Qamer
1个回答

6

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

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

加载器执行以下操作:

  • 检查要加载的类是否之前已被加载,通过检查已加载类的注册表。如果已经加载过,则通过调试日志忽略请求。

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

在引导时,全局范围内的魔术函数用于构建数据库、核心库等。

传统的单例方法会执行类似以下操作(自动加载):

return $className::instance();

当实例方法返回一个实例或构造函数时,如果尚未实例化,则可以省去跟踪已加载或未加载内容的需要。如果类已加载,将传递一个引用,否则将创建并返回一个新对象。

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

据我所知,有针对CI-3的补丁可供使用,使加载程序更加灵活,在这些情况下允许通过返回对象或引用来自由地工作,但我不知道Ellis Labs采取了什么措施。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接