通过yiic.PHP自动创建一个应用后,入口文件初始代码如下:
其中第三行引入了一个yii.PHP的文件,这个可以在yii核心目录里的framework/下找到,这个文件中定义了一个Yii类,并且继承了YiiBase类。
代码如下
/**
- Yii is a helper class serving common framework functionalities.
- It encapsulates {@link YiiBase} which provides the actual implementation.
- By writing your own Yii class,you can customize some functionalities of YiiBase.
- @author Qiang Xue qiang.xue@gmail.com
- @package system
- @since 1.0
*/
class Yii extends YiiBase
{
}
而
这个方法实际上是在YiiBase父类中定义的,所以,Yii为我们预留了扩展的可能。我们只需要在yii.PHP中添加我们想要扩展的方法即可,在项目中直接使用 Yii::方法名() 调用。 为了将项目代码和核心目录完全分离,我个人觉得在项目目录下使用另外一个yii.PHP来替代从核心目录中包含yii.PHP更加好。
这里我用了更加极端的方法,我直接将yii这个类定义在了入口文件,并扩展了一个全局工厂函数 instance()方法,请看代码:
这个类是在最后一行Yii::createWebApplication()之前定义的,以保证Yii类能正常使用(不要把这个类放在文件末尾,会出错。)
在项目中任何地方,使用$obj = Yii::instance($alias);去实例化一个类,并且是单例模式。
YiiBase中的两个比较重要的方法 (import,autoload)
然后看看YiiBase中的import方法就知道这些静态变量是干嘛用的了:$isClass = $className !== '';
if ($isClass && (class_exists($className,false) || interface_exists($className,false))) {
return self::$_imports[$alias] = $className;
}
if (($path = self::getPathOfAlias($alias)) !== false) {
if ($isClass) {
if ($forceInclude) {
if (is_file($path . '.PHP')) {
require($path . '.PHP');
} else {
throw new CException(Yii::t('yii',array('{alias}' => $alias)));
}
self::$_imports[$alias] = $className;
} else {
self::$classMap[$className] = $path . '.PHP';
}
return $className;
}
// $alias是'system.web.'这样的已*结尾的路径,将路径加到include_path中
else // a directory
{
if (self::$_includePaths === null) {
self::$_includePaths = array_unique(explode(PATH_SEPARATOR,get_include_path()));
if (($pos = array_search('.',self::$_includePaths,true)) !== false) {
unset(self::$_includePaths[$pos]);
}
}
array_unshift(self::$_includePaths,$path);
if (self::$enableIncludePath && set_include_path('.' . PATH_SEPARATOR . implode(PATH_SEPARATOR,self::$_includePaths)) === false) {
self::$enableIncludePath = false;
}
return self::$_imports[$alias] = $path;
}
} else {
throw new CException(Yii::t('yii',array('{alias}' => $alias)));
}
}
是的,上面这个方法最后就把要加载的东西都放到$_imports,$_includePaths中去了。这就是Yii的import方法,好的,接下来我们看看autoload方法:
return class_exists($className,false); } return true;} config文件中的 import 项里的类或路径在脚本启动中会被自动导入。用户应用里个别类需要引入的类可以在类定义前加入 Yii::import() 语句。
原文链接:https://www.f2er.com/php/20188.html