使用Yii架構中遇到的三個相關問題_PHP教程

來源:互聯網
上載者:User
以下由我們在信易網路公司開發項目的時候終結出的一些經驗

使用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檔案中欲引入全域變數的問題 還原一...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.