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

相關文章
相關標籤/搜索