Yii框架文摘之二yii的入口與app應用例項(Yii::app())

akbarken發表於2014-07-08
那麼在瀏覽器中輸入 localhost/bootstrap/index.php時 yii都做為我們做了一些什麼咧
 
首先 我們來看index.php檔案,這是yii應用的唯一入口
 
01 //定義yii的引導檔案,裡面定義了一個叫Yii的類
02 $yii=dirname(__FILE__).'/../yii/framework/yii.php';
03 //定義web應用的配置檔案
04 $config=dirname(__FILE__).'/protected/config/main.php';
05 //開發模式下開啟debug除錯
06 // remove the following lines when in production mode
07 defined('YII_DEBUG'or define('YII_DEBUG',true);
08 // specify how many levels of call stack should be shown in each log message
09 defined('YII_TRACE_LEVEL'or define('YII_TRACE_LEVEL',3);
10 //匯入Yii的引導檔案
11 require_once($yii);
12 //建立應用並初始化配置檔案,執行應用
13 Yii::createWebApplication($config)->run();
 
那麼createWebApplication方法主要是做寫什麼事情咧,我們去Yii的類裡面看看
我們看到,Yii是呼叫了自身的另外一個靜態方法createApplication,並且傳遞了配置檔案引數$config

1 public static function createWebApplication($config=null)
2     {
3         return self::createApplication('CWebApplication',$config);
4     }
 
我們接著往下看,發現Yii在createApplication方法裡面返回了一個 CWebApplication 類的例項化物件,並在建構函式時傳遞了配置檔案引數
1 public static function createApplication($class,$config=null)
2     {
3         return new $class($config);
4     }
 
似乎想知道發生了什麼,還得進入 CWebApplication的建構函式裡面看看,那麼我們去看看

1 public function __construct($config=null)
2     {
3         //將建立的webapp例項賦值給Yii的靜態屬性$app,在整個程式中可以使用Yii::app()來使用這個應用物件,這是一個單例模式
4         Yii::setApplication($this);
5         ......   
6     }
我們看到,在建構函式的第一步,呼叫了Yii的setApplication方法,並傳遞了例項化出來的CWebApplication物件,我們進入Yii的這個靜態方法可以看到,Yii將建立出來的app物件賦值給了Yii的私有的靜態屬性$_app;
    
1 public static function setApplication($app)
2     {
3         if(self::$_app===null || $app===null)
4             self::$_app=$app;
5         else
6             throw new CException(Yii::t('yii','Yii application can only be created once.'));
7     }
在Yii中我們又看到了這樣的公共靜態方法,在app()方法中,返回了它的私有靜態屬性$_app也就是CWebApplication物件
1 public static function app()
2     {
3         return self::$_app;
4     }
 
所以在接下來的頁面的任何地方,我們都可以呼叫Yii::app()來訪問CWebApplication物件,並且它是個單例物件。
http://my.oschina.net/lonxom/blog/168227

相關文章