以下由我們在信易網路公司開發項目的時候終結出的一些經驗
使用Yii架構中遇到的三個問題
1、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檔案。
2、引入第三方擴充時的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的第二個參數,強制載入整個目錄。
3、Yii的錯誤記錄檔
問題就不細述了,只是將生產環境的配置整到了開發環境,於是錯誤看不到了。調整了下日誌的規則,就OK了。
Yii對錯誤記錄檔的處理依賴於PHP的set_error_handler函數和set_exception_handler函數。在CApplication的initSystemHandlers方法中有對這兩個函數的處理。
本文由專註於成都網站建設的信易網路發布,更多關於yii的資訊請關注信易網路隨後的發布,信易網路的官網http://www.ir58.com
http://www.bkjia.com/PHPjc/770157.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/770157.htmlTechArticle以下由我們在信易網路公司開發項目的時候終結出的一些經驗 使用Yii架構中遇到的三個問題 1、main.php檔案中欲引入全域變數的問題 還原一...