路径别名和命名空间

Yii 广泛的使用了路径别名.路径别名是和目录或者文件相关联的.它是通过使用点号(".")语法指定的,类似于以下这种被广泛使用的命名空间的格式:

RootAlias.path.to.target

RootAlias 则是一些已经存在目录的别名.通过调用 YiiBase::setPathOfAlias() 我们可以定义新的路径别名(包括根目录别名).

为了方便起见,Yii 预定义了以下根目录别名:

  • system: 指向 Yii 框架目录;
  • application: 指向应用程序 基本目录(base directory);
  • webroot: 指向包含里 入口脚本 文件的目录. 此别名自 1.0.3 版起生效.
  • module: 指向当前运行程序模型的目录. 此别名自 1.0.3 版起生效.

通过使用 YiiBase::getPathOfAlias(), 别名可以被转换成他的真实路径. 例如, system.web.CController 可以被转换成 yii/framework/web/CController.

使用别名来插入已定义的类是非常方便的.例如,如果我们想要包含 CController 类的定义, 我们可以通过以下方式调用:

Yii::import('system.web.CController');

import 方法不同于 includerequire,它是更加高效的.实际上被导入(import)的类定义直到它第一次被调用之前都是不会被包含的. 同样的,多次导入同一个命名空间要比 include_oncerequire_once 快很多.

小贴士: 当调用一个通过 Yii 框架定义的类时, 我们不必导入或者包含它.所有的 Yii 核心类都是被预定义的.

我们也可以按照以下的语法导入整个目录,以便目录下所有的类文件都可以在需要时被包含.

Yii::import('system.web.*');

除了 import 外, 别名同样被用在其他很多地方来调用类.例如, 别名可以被传递到 Yii::createComponent() 创建的一个对应类的实例, 即使这个类文件没有被预先包含.

不要把别名和命名空间混淆了.命名空间调用了一些类名的逻辑分组以便他们可以同其他类名区分开,即使他们的名称是一样的,而别名则是用来引用类文件或者目录的.所以路径别名和命名空间并不冲突.

小贴士: 因为PHP 5.3.0以前的版本并不内置支持名命名空间,所以你并不能创建两个有着同样名称但是不同定义的类的实例.为此,所有 Yii 框架类都以字母 'C'(代表 'class') 为前缀,以便避免与用户自定义类产生冲突.在这里我们推荐为 Yii 框架保留'C'字母前缀的唯一使用权,用户自定义类则可以使用其他字母作为前缀.