我们接着看CWebApplication的构造函数(下文中将CWebApplication简称webapp)
public function __construct($config=null)
{
//将创建的webapp实例赋值给Yii的静态属性$app,在整个进程中可以使用Yii::app()来使用这个应用对象,这是一个单例模式
Yii::setApplication($this);
//在赋值app应用对象之后,webapp应用对象导入$config指向的配置文件路径,并将配置文件中返回的数组赋值给$config变量
if(is_string($config))
$config=require($config);
//如果我们在此处打印$config,你会发现,打印出来的数组就是protected/config/main.php里的数组
//我们可以看到,$config数组中basePath对应的值是个路径,指向的是protected目录,这个目录就是基础应用目录,setBasePath方法
是将basePath的值赋值给webapp的私有变量$_basePath,在网页的任何地方,我们都可以使用Yii::app()->basePath来调用获取该路径
if(isset($config['basePath']))
{
$this->setBasePath($config['basePath']);
unset($config['basePath']);
}
else
$this->setBasePath('protected');
//设置application,webroot,ext三个路径别名,路径别名顾名思义是对某一个路径的简称,详见下文setPathOfAlias方法
Yii::setPathOfAlias('application',$this->getBasePath());
Yii::setPathOfAlias('webroot',dirname($_SERVER['SCRIPT_FILENAME']));
if(isset($config['extensionPath']))
{
$this->setExtensionPath($config['extensionPath']);
unset($config['extensionPath']);
}
else
Yii::setPathOfAlias('ext',$this->getBasePath().DIRECTORY_SEPARATOR.'extensions');
//如果配置文件中有自定义路径别名aliases,则设置相应的路径别名
if(isset($config['aliases']))
{
$this->setAliases($config['aliases']);
unset($config['aliases']);
}
}
方法 Yii::setPathOfAlias ,实际上是用webapp用一个私有的静态属性$_aliases的一个数组来管理路径别名,在页面的任何地方你都可以使用Yii
:
:getPathOfAlias来获取路径别名对应的全路径,路径别名结合Yii::import()方法导入一个类是YII中常用的导入类方式,你可以通过Yii
:
:import(
'alias.path.to.ClassName'),使用路径别名来导入一个类,比如Yii::import('application.controllers.SiteController')表示导入SiteController类,Yii::import('application.controllers.*')则表示导入controllers目录下面的所有类,Yii::import()只会在第一次使用该类时导入,而且比requre_once和Include_once更高效;
public static function setPathOfAlias($alias,$path)
{
if(empty($path))
unset(self::$_aliases[$alias]);
else
self::$_aliases[$alias]=rtrim($path,'\\/');
}