入口文件
index.php
入口文件index.php
中主要定义了一些全局路径变量如BASEPATH
和APPPATH
这种常用的变量
并且可以配置代码的部署环境,最后require
真正的核心文件CodeIgniter.php
CodeIgniter.php
位于system/core/
目录下,该文件是最主要的核心文件,他负责引入全局需要用到的一些关键的类,比如Common.php
和Controller.php
,这些类处于system/core
目录下CodeIgniter.php
有点策略模式和工厂模式的意味了,很好的解决了代码耦合的问题,代码可拓展性很高,这也是我喜欢CI的一个地方
CI的异常处理机制是利用PHP的error_handler和exception_handler进行处理,实现代码如下:
|
|
这里的error_handler和exception_handler都是利用CI的Loader进行Exception类的实例化并且进行异常处理,同时Loader加载Log类进行日志记录
核心类库
Common.php
该文件定义了一些全局当中需要用到的函数,辅助框架运行,如is_cli()
判断来判断是否cli运行环境
DB_query_builder.php
分析ORM的语法,主要利用explode
函数进行词语分割
这里我们看看select方法的实现
通过explode分割select里面的参数,并放入数组当中,利用qb_cache_exists
记录已有的操作类型,qb_cache_select
记录需要select的数据,最后可以通过这些数据当中的数据进行不同数据库dialect下SQL语句的生成
另外query_builder中每个方法都返回一个$this
指针,实现了CI中ORM”object->method()->method()”这样的链式操作。
在database目录下的都是主要的db driver,是一个一个的abstract类,用于被不同的数据库类型db drvier继承。
Loader.php
Loader就有点单例模式和策略模式的意味在里面了
上面是Loader的属性,用来保存已经加载过的工具,使实例化出来的工具类或者方法保持单一性,不会重复生成造成浪费。
例如$_ci_models
,在控制器中利用代码$this->load->model('Model_name')
就是首先判断$_ci_models
中是否存在Model_name这一model,如不存在则进行加载并保存到已加载model的数组当中,大大提高了性能和内存的利用率。$this->load
便是Loader
类被保存在全局唯一的实例Controller当中的load属性。
我们可以看一下Loader中model方法的实现
Config.php
在Config类当中,最核心的部分就是Config类的两个属性,用于保存已加载过的配置文件,在CI中这种保存变量的方法随处可见,这种设计方式的好处是显而易见的,大大提高了内存的利用率,降低重复加载带来的性能开销。我们来看一下这两个属性的定义以及他的注释
每一次加载新的配置的时候,Config类先对配置是否已加载然后再作出相应的操作,如果已加载则利用array_merge()
函数来进行已加载配置数组的合并
Controller.php
乍一看Controller类下没有写什么,就只有几十行代码,甚至大部分都是注释,但是Controller是整个CI的心脏,利用单例模式
承担起整个应用的正常运行。
所有实例化出来的类都统一放到Controller当中,是系统架构中的核心部分。全局通过get_instance()
这一个方法来获取Controller单例实体,保证各个工具类的单例性。
整个系统就是靠着Controller这一个枢纽运行起来的。
路由分发
整个应用的路由分发是由Router类来进行分发的,联合URI类,进行url的分析,在此就不在赘述了。
可以仔细阅读system/core
下的Router.php
和URI.php