分類  >  Web前端 >

YII的途徑別名管理與對象創建管理(避免絕對路徑,方便部署不同的環境)

tags:    時間:2013-12-10 08:02:54
YII的路徑別名管理與對象創建管理(避免絕對路徑,方便部署不同的環境)

YiiBase類為YII框架的運行提供了公共的基礎功能:別名管理與對象創建管理。

在創建一個php的對象時,需要先include這個類的定義文件,然後再new這個對象。在不同環境下(開發環境/測試環境/線上環境),apache的webroot路徑的配置可能不一樣,所以這個類的定義文件的全路徑就會不同,Yii框架通過YiiBase的別名管理來解決了這個問題。

在創建對象時,需要導入對應類的定義,經常需要使用這5個函數:include()、include_once()、require()、require_once()、set_include_path()。Yii通過使用YiiBase::import()來統一解決這個問題。下圖描述了YiiBase提供「別名管理與對象創建管理」的工作原理:



首先看別名管理,它是通過為某個文件夾(一個文件夾往往對應一個模塊)起一個別名,在YII框架中可以使用這個別名來替代這個文件夾的全路徑,比如:system別名代表的是框架/home/work/yii/framework的路徑,所以可以使用system.base.CApplication代表/home/work/yii/framework/base/CApplication.php文件的路徑。當然在應用層(我們)的代碼中也可以通過Yii::setPathOfAlias來註冊別名。

一般情況下我們使用絕對路徑或者相對路徑來進行文件引用,當然這2中情況都有弊端。絕對路徑:當我們的代碼部署到測試環境或者線上環境的時候需要大量修改被include文件的路徑;相對路徑:當某些模塊的文件夾的位置發生調整(改名)的時候,所有的相對路徑都需要修改。而使用別名的方式只需要改一處:註冊別名的時候,即Yii::setPathOfAlias()。從而將文件夾的變動而導致的代碼改動集中到一處完成。

再看import功能:a、導入一個類的定義,從而可以創建該類的對象;b、將某個文件夾加入到include_path,從而可以直接include這個文件下的所有文件。Yii::import相當於如下5個函數的統一:include()、include_once()、require()、require_once()、set_include_path()。而且一般情況下速度會比這些函數更快。當然Yii::import支持別名的功能,從而可以解決路徑變動帶來的麻煩。

最後看一下對象的創建,在YII框架中有2中方法創建對象:1、使用new關鍵字;2、使用Yii::createComponent方法。

當使用new關鍵字創建對象時,autoload會分3步來尋找對應類的定義:a、判斷是否為framework中的類(framework的所有類和這個類的全路徑都保存在YiiBase的一個成員變數中);2、判斷是否使用Yii::import導入了這個類,對於非框架的類,我們在創建這個類的對象時需要先import這個類的定義;3、從include_path目錄下查找以這個類名字命名的php腳本,所以在開發的時候類名盡量與文件名保存一致,這樣我們導入包含這個文件的文件夾就行了,從而無需把這個文件夾中的每個文件都導入一次。

當使用Yii::createComponent方法創建對象時,它提供了比new關鍵字更多的功能:a、通過這個類的全路徑別名來指定類的位置和類名(類名必須與文件名一致),當這個類還沒有導入的時候,會根據全路徑來自動導入這個類的定義;2、對創建出來的對象的成員變數進行賦值。即如下圖描述,原來要寫3行以上的代碼,現在一行代碼就可以搞定(write less, do more)。
 

推薦閱讀文章

Bookmark the permalink ,來源:互聯網