使用Yii框架中遇到的三個問題

使用Yii框架中遇到的三個問題
一、main.php文件中欲引入全局變量的問題
還原一下此問題:在Yii框架中,main.php通常會做爲整個應用的配置文件,保存Application的各類參數,直接return數組。在使用的過程當中,由於main.php文件必定會被Yii提早加載,因此將一些全局性的操做也放在了此文件,加載一些類操做啥的沒有什麼問題,當有一次加了一個全局變量,而且在其它地方使用global獲取全局變量時,發現不管我如何努力都獲得的是NULL。各類嘗試後,終於,把引入的位置放在入口文件index.php,得以解決。什麼緣由?咱們重現一下Yii的main.php文件加載。以下代碼
index.php文件:
class
CApp
{
public
function
__construct
(
$config
)
{
$config
=
require
(
$config
)
;
}
}
$path
=
"main.php"
;
$app
=
new
CApp
(
$path
)
;
global
$global
;
var_dump
(
$global
)
;

main.php文件:
$global = array(1, 2, 3); return array();


兩個文件放在同一目錄,直接運行index.php,輸出的$global爲NULL,若是咱們在CApp的構造函數中直接輸出$global,則會有結果輸出。什麼緣由?做用域的問題!
當咱們在main.php文件中定義了一個變量,雖然是想將其做爲全局變量使用,可是當咱們在局部的做用域中require時,其僅僅做爲一個局部做用域的變量存在。咱們在TIPI中有說到函數調用是嵌套的,每一個嵌套都會有一個做用域,在這個做用域中的變量僅在當前有效,嵌套結束,變量生命週期結束。
所以,咱們若是想把main.php中的全局變量真的做爲整個應用的全局變量使用,則須要在入口文件的做用域中require main.php文件。
二、引入第三方擴展時的class_exists問題
Yii框架Yii基於PHP5的autoload機制來提供類的自動加載功能,自動加載器爲YiiBase類的靜態方法autoload()。當程序中用new建立對象或訪問到類的靜態成員,PHP將類名傳遞給類加載器,由類加載器完成類文件的include。可是若是咱們引入了第三方擴展,而第三方擴展的命名規則和Yii的不同,因而咱們會常常看到報錯說 require XXX 文件失敗。若是你在google中搜索「yii framework class_exists」,你會發現Yii框架的做用Xue Qiang有回答使用者能夠經過使用相似於: class_exists(’MyClass’, false)的方式。
class_exists函數檢查類是否已定義,若是由 class_name 所指的類已經定義,此函數返回 TRUE,不然返回 FALSE。在PHP內核中,此函數會查找當前類表中由 class_name 所指的類是否存在,在查找以前會所有轉化爲小寫,因此不會區分大小寫。其第二個參數是指是否使用autoload,默認爲使用,此時class_exists函數會先執行autoload,而後再查找執行了autoload後類表中由 class_name 所指的類是否存在。所以咱們能夠經過設置第二個參數其爲FALSE來繞過自動加載。
這能夠解決問題,可是若是咱們使用的是沒法修改的第三方代碼呢?怎麼辦?我本身是簡單的hack了下,在調用第三方的操做之就將須要的類給加載了。
後來又採用了另外一種解決方案:直接使用Yii:import的第二個參數,強制加載整個目錄。
三、Yii的錯誤日誌
問題就不細述了,只是將生產環境的配置整到了開發環境,因而錯誤看不到了。調整了下日誌的規則,就OK了。
Yii對錯誤日誌的處理依賴於PHP的set_error_handler函數和set_exception_handler函數。在CApplication的initSystemHandlers方法中有對這兩個函數的處理。
相關文章
相關標籤/搜索