yii架構autoload機制

來源:互聯網
上載者:User

Yii架構宣稱自己的類載入方式很高效,是真正的“用時載入”,那究竟特別在哪裡?今天研究了一下源碼,發現其實是在代碼級加了一層“路徑緩衝”。

我們知道,要實現自己的autoload方法,需要採用spl_autoload_register()函數註冊一個autoload方法,Yii註冊的這個方法是YiiBase::autoload(),稍後再講解這個方法的邏輯。另外,Yii一般都用Yii::import($pathAlias, $forceInclude=false)來載入相應的類(這個方法直接調用了YiiBase::import() ),這個方法配合YiiBase::autoload()就能實現“用時載入”了。

先說import的大致邏輯:

1、檢查self::$_imports數組是否存在相應的$pathAlias,如果有說明已經載入過了,直接返回類名或者目錄名;否則繼續第2步;

2、根據路徑別名獲得實際的路徑名,並根據路徑別名最後一部分是否是“*”可以知道要載入的路徑別名是否是一個檔案,如果是檔案,去第3步;否則去第4步;

3、如果是$forceInclude是true,則立即require這個檔案,並在$_imports數組中增加一項$alias => $className;否則在數組$classMap中緩衝一項$className => $realPath;

4、對於路徑,會在數組$_includePaths中緩衝這個路徑,並且在$_imports數組中增加一項$alias => $realPath;

5、結束。

因為$forceInclude預設都為false,所以import不會立即載入相應的類,等到使用時才真正載入,這是YiiBase::autoload的工作。

autoload的大致邏輯:

1、檢查類名是否已緩衝在$classMap或$_coreClasses數組中,如果是則直接require相應的檔案路徑,$_coreClasses是架構自有類的映射表;否則去第2步;

2、檢測YiiBase::$enableIncludePath是否為false,如果是則去第3步,否則直接include($className . '.php')

3、遍曆$includePaths數組,將目錄名拼接上類名,檢查是否為合法的php檔案,如果是則include,然後跳出迴圈

4、結束。

需要注意的是,文檔指出:如果要與其他類庫一起使用,必須將$enableIncludePath置為false,以便在Yii::autoload()失敗時,其他類庫的autoload方法有機會執行。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.