项目路径 E:/htdocs
yii包放在htdocs下,同级目录中有项目文件夹project
project下面建yii目录,此目录为yiic生成的程序框架
index.php文件中定义了yii框架包中的接口类路径,以及主要配置文件main.php的路径。/protected/config/main.php
之后是统一的入口。
require_once($yii);
Yii::createWebApplication($config)->run();
其中的$config就是main的路径。
createWebApplication($config) => createApplication('CWebApplication',$config) => new CWebApplication($config)
CWebApplication extends CApplication extends CModule extends CComponent
CWebApplication 无构造函数,于是调用CApplication 的 __construct($config)
构造函数中给类中变量赋值
self::$_app = CWebApplication 的对象。
$this->_basePath = main文件所在目录的上一层。/protected
$_aliases['application'] = E:/htdocs/project/yii/project
$_aliases['webroot'] = E:/htdocs/project/yii
$_aliases['ext'] = E:/htdocs/project/yii/project/extensions
initSystemHandlers函数初始化异常及错误句柄。
configure($config)=>foreach($config as $key=>$value) $this->$key=$value;
$config中有
array(7) {其中name是CApplication 中变量
[0]=>
string(4) "name"
[1]=>
string(8) "language"
[2]=>
string(7) "preload"
[3]=>
string(6) "import"
[4]=>
string(7) "modules"
[5]=>
string(10) "components"
[6]=>
string(6) "params"
}
preload是CModule 中变量
其余的key都是通过重写的__set函数赋值
CComponent中的__set方法会判断当前类中是否有"set".$key这个函数,如果有,就返回该函数的返回值。
所以configure($config)相当于执行了setlanguage, setimport, setmodules, setcomponents, setparams这几个函数。
setimport会调用yii:import($v)
通过self::getPathOfAlias($v)设置$_aliases[$v] = $_aliases['application'] . $v中application和*之间的部分.
设置self::$_includePaths为上面的$_aliases[$v]的值。
例:main.php中
'import'=>array(
'application.models.*',
...............
)
$_aliases[application.models.*] = E:\htdocs\project\yii\protected\models
self::$_includePaths[X] = E:\htdocs\project\yii\protected\models
接下来是setmodules函数
该函数会判断main.php中modules字段中的key(下面用$key表示)对应的values(数组)是否设置了以class为key的键值对。
如未设置,$this->_modulePath = "E:\htdocs\project\yii\protected\modules"
$_aliases[$key] = E:\htdocs\project\yii\protected\modules\$key
同时给该数组增加key为class的值。该值为$key.'.'.ucfirst($key).'Module' 。并把该值赋给$this->_moduleConfig[$key]
例:main.php中
'modules'=>array(
'test' => array( ),
....................
)
$_aliases['test'] == E:\htdocs\project\yii\protected\modules\test
$this->_moduleConfig['test'] == array('class'=>"test.TestModule")
setcomponents函数是给$this->_componentConfig赋值。
setparams是给$this->_params赋值。