Yii学习笔记:扩展YiiBase入口类

经过yiic.php自动建立一个应用后,入口文件初始代码以下: php


<?php
// change the following paths if necessary
$yii=dirname(__FILE__).'/../yii/framework/yii.php';
$config=dirname(__FILE__).'/protected/config/main.php';
// remove the following lines when in production mode
defined('YII_DEBUG') or define('YII_DEBUG',true);
// specify how many levels of call stack should be shown in each log message
defined('YII_TRACE_LEVEL') or define('YII_TRACE_LEVEL',3);
require_once($yii);
Yii::createWebApplication($config)->run();



其中第三行引入了一个yii.php的文件,这个能够在yii核心目录里的framework/下找到,这个文件中定义了一个Yii类,而且继承了YiiBase类。


代码以下 yii


require(dirname(__FILE__).'/YiiBase.php');

/**
 * 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
{
}


ide

Yii::createWebApplication
这个方法其实是在YiiBase父类中定义的,因此,Yii为咱们预留了扩展的可能。咱们只须要在yii.php中添加咱们想要扩展的方法便可,在项目中直接使用 Yii::方法名() 调用。

为了将项目代码和核心目录彻底分离,我我的以为在项目目录下使用另一个yii.php来替代从核心目录中包含yii.php更加好。 函数

这里我用了更加极端的方法,我直接将yii这个类定义在了入口文件,并扩展了一个全局工厂函数 instance()方法,请看代码: ui

<?php
// change the following paths if necessary
$yii=dirname(__FILE__).'/../yii/framework/YiiBase.php';
$config=dirname(__FILE__).'/protected/config/main.php';
// remove the following lines when in production mode
defined('YII_DEBUG') or define('YII_DEBUG',true);
// specify how many levels of call stack should be shown in each log message
defined('YII_TRACE_LEVEL') or define('YII_TRACE_LEVEL',3);
require_once($yii);
//扩展基类
class Yii extends YiiBase{
    /**
     * 全局扩展方法:工厂函数
     * @param type $alias 类库别名
     */
    static function instance($alias){
        static $_class_ = array();
        $key = md5($alias);
        if(!isset($_class_[$key])){
            $_class_[$key] = self::createComponent($alias);
        }
        return $_class_[$key];
    }
}
Yii::createWebApplication($config)->run();



这个类是在最后一行Yii::createWebApplication()以前定义的,以保证Yii类能正常使用(不要把这个类放在文件末尾,会出错。) spa

在项目中任何地方,使用$obj = Yii::instance($alias);去实例化一个类,而且是单例模式。 code

相关文章
相关标签/搜索