亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > PHP > 正文

Yii2的深入學習 自動加載機制

2020-03-22 17:44:08
字體:
來源:轉載
供稿:網友
  • Yii2 的自動加載分兩部分,一部分是 Composer 的自動加載機制,另一部分是 Yii2 框架自身的自動加載機制。

    Composer自動加載

    對于庫的自動加載信息,Composer 生成了一個vendor/autoload.php文件。你可以簡單的引入這個文件,你會得到一個自動加載的支持。

    在之前的文章,入口文件的介紹中,我們可以看到如下內容:

    // 引入 vendor 中的 autoload.php 文件,會基于 composer 的機制自動加載類require(__DIR__ . '/../vendor/autoload.php');

    因為這個系列主要是關于 Yii2 的,所以有關 Composer 自動加載機制就不在這里詳細說明了。

    可查閱資料:

    Composer 自動加載 Composer自動加載-參考 Composer 中文網址Yii2 框架的自動加載機制

    Yii2 框架的自動加載是通過spl_autoload_register 方法實現的。

    在之前的文章,入口文件的介紹中,我們可以看到如下內容:

    // 引入 Yii 框架的文件 Yii.phprequire(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php');

    Yii.php 里究竟是什么內容?如何實現了自動加載?

    下面我們來看一下,Yii.php 的內容如下:

    <?php/** * Yii bootstrap file. * * @link http://www.yiiframework.com/ * @copyright Copyright (c) 2008 Yii Software LLC * @license http://www.yiiframework.com/license/ */require(__DIR__ . '/BaseYii.php');/** * Yii is a helper html' target='_blank'>class serving common framework functionalities. * * It extends from [[yiiBaseYii]] which provides the actual implementation. * By writing your own Yii class, you can customize some functionalities of [[yiiBaseYii]]. * * @author Qiang Xue <qiang.xue@gmail.com> * @since 2.0 */class Yii extends yiiBaseYii{}/** * spl_autoload_register — 注冊給定的函數作為 __autoload 的實現 * * bool spl_autoload_register ([ callable $autoload_function [, bool $throw = true [, bool $prepend = false ]]] ) * * 將函數注冊到SPL __autoload函數隊列中。如果該隊列中的函數尚未激活,則激活它們。 * 如果在你的程序中已經實現了__autoload()函數,它必須顯式注冊到__autoload()隊列中。 * 因為 spl_autoload_register()函數會將Zend Engine中的__autoload()函數取代為spl_autoload()或spl_autoload_call()。 * 如果需要多條 autoload 函數,spl_autoload_register() 滿足了此類需求。 * 它實際上創建了 autoload 函數的隊列,按定義時的順序逐個執行。 * 相比之下, __autoload() 只可以定義一次。 * * autoload_function * 欲注冊的自動裝載函數。如果沒有提供任何參數,則自動注冊 autoload 的默認實現函數spl_autoload()。 * * throw * 此參數設置了 autoload_function 無法成功注冊時, spl_autoload_register()是否拋出異常。 * * prepend * 如果是 true,spl_autoload_register() 會添加函數到隊列之首,而不是隊列尾部。 * * Yii 注冊了 Yii 的 autoload 函數,實現自動加載, 其實現在 yiiBaseYii 中 */spl_autoload_register(['Yii', 'autoload'], true, true);// 定義 Yii 核心的 class 的類名與文件地址的 MapYii::$classMap = require(__DIR__ . '/classes.php');// 創建 Yii 的依賴注入的容器Yii::$container = new yiidiContainer();

    其主要內容就是引入了BaseYii.php 文件,然后聲明了類 Yii,繼承了 BaseYii,然后注冊了 Yii (其實是 BaseYii)的 autoload 方法,去實現自動加載。之后又引入了Yii 核心類名與文件地址一一對應的 Map,存儲到Yii::$classMap 中。最后創建了一個yiidiContainer 的實例,存儲到Yii::$container 中。

    可以看出實現自動加載的關鍵代碼是:

    spl_autoload_register(['Yii', 'autoload'], true, true);

    下面我們來看一下BaseYii 中autoload 方法的實現,其內容如下:

        /**     * Class autoload loader.     * This method is invoked automatically when PHP sees an unknown class.     * The method will attempt to include the class file according to the following procedure:     *     * 1. Search in [[classMap]];     * 2. If the class is namespaced (e.g. `yiiaseComponent`), it will attempt     *    to include the file associated with the corresponding path alias     *    (e.g. `@yii/base/Component.php`);     *     * This autoloader allows loading classes that follow the [PSR-4 standard](http://www.php-fig.org/psr/psr-4/)     * and have its top-level namespace or sub-namespaces defined as path aliases.     *     * Example: When aliases `@yii` and `@yii/bootstrap` are defined, classes in the `yiiootstrap` namespace     * will be loaded using the `@yii/bootstrap` alias which points to the directory where bootstrap extension     * files are installed and all classes from other `yii` namespaces will be loaded from the yii framework directory.     *     * Also the [guide section on autoloading](guide:concept-autoloading).     *     * @param string $className the fully qualified class name without a leading backslash ''     * @throws UnknownClassException if the class does not exist in the class file     */    public static function autoload($className)    {        // 自動加載類        if (isset(static::$classMap[$className])) {            // 如果 $classMap 中存在該類,就直接使用            $classFile = static::$classMap[$className];            // 如果第一個字符串為'@',就意味著對應的文件地址是別名,就將它轉化成真實的文件地址            if ($classFile[0] === '@') {                $classFile = static::getAlias($classFile);            }        } elseif (strpos($className, '/') !== false) {            // 如果存在'/',就意味著含有 namespace,可以拼成別名,再根據別名獲取真實的文件地址            $classFile = static::getAlias('@' . str_replace('/', '/', $className) . '.php', false);            // 沒取到真是文件地址或者獲取的地址不是一個文件,就返回空            if ($classFile === false || !is_file($classFile)) {                return;            }        } else {            return;        }        // 引入該類的文件        include($classFile);        // 如果是調試模式,而且 $className 即不是類,不是接口,也不是 trait,就拋出異常        if (YII_DEBUG && !class_exists($className, false) && !interface_exists($className, false) && !trait_exists($className, false)) {            throw new UnknownClassException('Unable to find '$className' in file: $classFile. Namespace missing?');        }    }

    其中,大家可能不太清楚getAlias 方法,這個方法其實就是將 Yii2 中的別名轉化成真實的文件地址,關于該方法的具體內容,之后會詳細講解。

    舉幾個例子,幫助大家理解一下。

    如果Yii::$classMap 的值如下:

    Yii::$classMap = [    'app/test/Test' => '/var/www/basic/webtest/Test.php'];

    當你使用 ‘app/test/Test’ 類時,就會自動引入'/var/www/basic/webtest/Test.php' 文件,項目中的內容當然不是這個樣子的,這只是個簡單的例子,便于大家理解。

    在繼續上面的例子,如果你使用了‘yiiaseComponent’ 類,它就會轉變成 ‘@yii/base/Component.php’ 別名,然后在根據別名獲取到它的文件地址,引入進來。

    以上就是 Yii2 的自動加載機制的基本內容~~

    對 Yii2 源碼有興趣的同學可以關注項目yii2-2.0.3-annotated,現在在上面已經添加了不少關于 Yii2 源碼的注釋,之后還會繼續添加~

    有興趣的同學也可以參與進來,提交Yii2 源碼的注釋。

    PHP編程

    鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

  • 發表評論 共有條評論
    用戶名: 密碼:
    驗證碼: 匿名發表
    亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
    亚洲视频自拍偷拍| 亚洲欧美日韩国产中文专区| 精品久久香蕉国产线看观看gif| 黑人巨大精品欧美一区二区一视频| 国产日本欧美视频| 4438全国亚洲精品在线观看视频| 日韩精品在线观看网站| 国产精品99久久久久久久久| 久久久久久国产精品美女| 亚洲jizzjizz日本少妇| 国产成人精品免费视频| 国产精品第一视频| 国产中文日韩欧美| 国产视频精品xxxx| 欧美极品在线播放| 97精品国产aⅴ7777| 欧美一区二三区| 亚洲国产欧美一区二区三区同亚洲| 亚洲第一区在线观看| 欧美最猛性xxxxx(亚洲精品)| 亚洲国语精品自产拍在线观看| 大桥未久av一区二区三区| 97在线视频一区| 5252色成人免费视频| 综合网日日天干夜夜久久| 国产精品久久久久久久久久小说| 亚洲精品综合久久中文字幕| 色哟哟入口国产精品| 国产一区二区成人| 日韩在线欧美在线国产在线| 亚洲人高潮女人毛茸茸| 色www亚洲国产张柏芝| 日韩动漫免费观看电视剧高清| 亚洲国产又黄又爽女人高潮的| 精品日本美女福利在线观看| 日韩亚洲精品电影| 亚洲成人aaa| 色噜噜亚洲精品中文字幕| 精品免费在线视频| 久久中文字幕国产| 姬川优奈aav一区二区| 狠狠色狠狠色综合日日五| 欧美日韩国产中文精品字幕自在自线| 欧美日韩不卡合集视频| 欧美日韩一区二区免费视频| 欧美精品成人91久久久久久久| 久久人人爽人人爽人人片av高清| 国产欧美最新羞羞视频在线观看| 欧美一级电影在线| 欧美精品一本久久男人的天堂| 亚洲香蕉av在线一区二区三区| 日韩中文字幕网站| 91精品久久久久久久久久久| 欧美夜福利tv在线| 国产一区二区黑人欧美xxxx| 亚洲第一天堂无码专区| 2019中文字幕全在线观看| 一区二区三区久久精品| 国产视频精品自拍| 色香阁99久久精品久久久| 国产成人精品一区二区在线| 亲子乱一区二区三区电影| 亚洲国产美女久久久久| 91理论片午午论夜理片久久| 国产日韩在线一区| 国产精品老女人视频| 综合久久五月天| 欧美性生交大片免费| 深夜精品寂寞黄网站在线观看| 日韩高清免费在线| 日韩精品极品视频免费观看| 欧美日韩另类在线| 国产一区二区三区丝袜| 国产精品日韩在线| 国产在线不卡精品| 韩国福利视频一区| 亚洲影视中文字幕| 亚洲午夜久久久久久久| 欧美性xxxxxxxxx| 国产狼人综合免费视频| 国产一区视频在线| 精品国产一区二区在线| 国产精品嫩草视频| 欧美日韩免费在线观看| 另类色图亚洲色图| 日本一区二区在线播放| 欧美亚洲第一区| 久久久精品久久久| 68精品国产免费久久久久久婷婷| 亚洲精品福利免费在线观看| 精品免费在线观看| 欧美高清在线视频观看不卡| 在线日韩欧美视频| 国产精品18久久久久久首页狼| 精品久久久久久中文字幕一区奶水| 在线观看91久久久久久| 91色中文字幕| 欧美国产精品日韩| 久久视频国产精品免费视频在线| 欧美刺激性大交免费视频| www.久久草.com| 亚洲欧美国产精品专区久久| 尤物九九久久国产精品的分类| 日韩电视剧免费观看网站| 国产成人自拍视频在线观看| 久久久久一本一区二区青青蜜月| 91夜夜揉人人捏人人添红杏| 成人欧美一区二区三区在线湿哒哒| 欧美成人免费一级人片100| 久久综合九色九九| 亚洲欧美国内爽妇网| 亚洲美女在线观看| 欧美乱妇40p| 亚洲欧洲成视频免费观看| 日韩av片永久免费网站| 91国自产精品中文字幕亚洲| 国产精国产精品| 欧美电影免费观看高清| 国产成人aa精品一区在线播放| 亚洲亚裔videos黑人hd| 国产精品999| 成人www视频在线观看| 日韩电视剧在线观看免费网站| 中日韩午夜理伦电影免费| 成人黄色片在线| 久久久久久18| 久久中文字幕在线视频| 欧美激情乱人伦一区| 亚洲国产成人精品电影| 亚洲免费精彩视频| 亚州国产精品久久久| 91久久久亚洲精品| 91欧美精品午夜性色福利在线| 人九九综合九九宗合| 亚洲va码欧洲m码| 久久激情五月丁香伊人| 成人激情综合网| 欧美精品生活片| 色哟哟亚洲精品一区二区| 狠狠做深爱婷婷久久综合一区| 日韩精品中文字幕在线| 亚洲午夜小视频| 大荫蒂欧美视频另类xxxx| 国产精品吊钟奶在线| 亚洲欧美一区二区精品久久久| 国产日韩欧美另类| 亚洲精品成人久久| 国产日本欧美在线观看| 国产精品久久久久9999| 一本色道久久88精品综合| 97在线观看免费| 色婷婷av一区二区三区在线观看| 91精品国产电影| 国产精品丝袜高跟| 亚洲va男人天堂| 亚洲综合在线小说| 久久中国妇女中文字幕| 久久久亚洲天堂| 久久久亚洲欧洲日产国码aⅴ| 97色在线观看免费视频| 色偷偷888欧美精品久久久| 亚州欧美日韩中文视频| 亚洲精品国产综合区久久久久久久| 成人免费xxxxx在线观看|