【PHP】Yii 1.0 生命周期源码 详细解读
生命周期源码解读
采用非
console的web模式
- 开始加载入口文件
index.php - 开始定义
debug,trace_level常量 - 加载框架入口文件
yii.php,注册类自动加载函数YiiBase的autoload方法 - 通过配置文件
config生成webApplication实例, - 如果查询不到
CWebApplication类,调用autoload方法,找出类文件路径再包含进来include/require - 生成实例先调用构造函数
__construct,CWebApplication无构造函数,朝上递归,搜索父类的构造方法即CApplication构造方法 CApplication定义了Yii的全局对象$_app, 其次定义了一些路径如basePath,application,webroot,extensionPath等- 构造函数 根据
config文件的alias数组定义一些路径别名 - 再进行预初始化(1.0版本为空)
- 然后才定义全局的
Exception,Error处理函数 - 然后注册一些系统的核心组件
components - 注册完组件后, 通过
config数组,把config所有属性赋予到CWebApplication实例上 - 这里很重要,如果
config里的属性在CWebApplication里面没有,则调用CWebApplication的父类CModule定义的魔术方法__isset - 如果检测调用的属性不是组件,则调用
CModule的父类魔术方法__set,这个方法会自发的把属性转换为方法,去调用相应的方法 - 通过
config的import属性设置include_path属性 - 通过
components属性设置预先加载相应的组件配置(注意,这里还没有生成组件实例哦) - 通过
modules加载模块化配置,设置模块路径别名 - 通过
params配置一些后面控制器要用到的一些全局参数(用户级参数即用户自己根据项目需要的参数在这里面定义) - 注意,
config的一级子属性不是随意配置的,否则会报找不到属性|方法的Exception - 把所有的属性赋予到
CWebApplication上后,开始绑定一些behavior - 然后根据
config的preload属性加载生成一些组件实例(注意,这里才生成真正的组件实例) - 然后调用
CWebApplication的'init'方法进行一些初始化的操作 init方法里面调用request的核心组件(这里生成了真正的request组件实例)- 到这里,
CApplication的构造方法就执行完毕了 - 然后调用
CApplication的run方法(因为$this指向的run方法在CWebApplication里面不存在,往上递归,调用父类的同名方法) run方法会触发onBeginRequest事件,register_shutdown_function注册程序关闭前执行的end方法, 然后调用processRequest方法开始处理具体的请求,然后调用onEndRequest事件processRequest会处理具体的控制器请求- 至此,Game Over ,施主,你已经功德圆满了!!!

浙公网安备 33010602011771号