生命周期源码解读
采用非
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 ,施主,你已经功德圆满了!!!