<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                自動加載的實現由`think\Loader`類 ## 自動加載 由于新版`ThinkPHP`完全采用了命名空間的特性,因此只需要給類庫正確定義所在的命名空間,而命名空間的路徑與類庫文件的目錄一致,那么就可以實現類的自動加載。 類庫的自動加載檢測順序如下: 1、類庫映射檢測; 2、`PSR-4`自動加載檢測; 3、`PSR-0`自動加載檢測; 系統會按順序檢測,一旦檢測生效的話,就會自動載入對應的類庫文件。 ## 類庫映射 遵循我們上面的命名空間定義規范的話,基本上可以完成類庫的自動加載了,但是如果定義了較多的命名空間的話,效率會有所下降,所以,我們可以給常用的類庫定義類庫映射。命名類庫映射相當于給類文件定義了一個別名,效率會比命名空間定位更高效,例如: ~~~ Loader::addClassMap('think\Log',LIB_PATH.'think\Log.php'); Loader::addClassMap('org\util\Array',LIB_PATH.'org\util\Array.php'); ~~~ 也可以利用`addClassMap`方法批量導入類庫映射定義,例如: ~~~ $map = [ 'think\Log' => LIB_PATH.'think\Log.php', 'org\util\array'=> LIB_PATH.'org\util\Array.php' ]; Loader::addClassMap($map); ~~~ >[danger] 注意詞代碼放到common.php或者start.php文件中 # import()方法 >[info]語法: boolen import(class, baseUrl, ext) 實際執行的是:`Loader::import($class, $baseUrl, $ext)` 不推薦,此方法在5.1+被移除 | 參數 | 說明 | | --- | --- | | class | 必須,表示要導入的類庫,具有命名空間的完整類。規則:目錄分割符`DS`(/或\\)用`.`表示`.`用`#`表示 | | baseUrl | 可選,表示導入的基礎路徑,最好以目錄分割符結尾 | | ext | 可選,表示導入的類庫后綴,默認是 .php 。 | 當設置第二個參數且不是數組時,文件路徑為`$baseUrl . $class . $ext;` ``` import('wechat-sdk.wechat', EXTEND_PATH, '.class.php');//引入 extend/wechat-sdk/wechat.class.php ``` 當沒有設置第二個參數時,他會優先先查找符合PSR-4的這個類,不存在則查找當前模塊下的這個類,還不存在則查找extend目錄下的這個類,還不存在則查找其他模塊下的此類,最后都沒找到則返回false ``` //相對路徑以網站根目錄作為起始目錄(這里偷懶不想新建其他目錄,單純加載extend里的文件的話,第二個參數是可以省略的) import('Test', '../extend'); //加載extend/user/Think.Test.php import('user.Think#Test', '../extend'); //在application\admin\controller\Index.php里定義加載當前模塊下的文件如(aplication/admin/Test/Alipay.class.php) import('admin.Test.Alipay'); //或者 import('@.Test.Alipay'); ``` ### **vendor**()導入第三方類庫 第一個參數中的.會解析成/ #會解析成. 加載vender文件夾下的文件還有一個方法省掉了路徑 vendor($class, $ext = EXT) 實際調用`Loader::import($class, VENDOR_PATH, $ext);` 此函數在5.1被廢除 ``` vendor('alipaycustom.AopEncrypt');//vendor/alipaycustom/AopEncrypt.php vendor('alipaycustom.alipaycustom#function');//vendor/alipaycustom/alipaycustom.function.php ``` ## Composer自動加載 5.0版本支持`Composer`安裝的類庫的自動加載,你可以直接按照`Composer`依賴庫中的命名空間直接調用。 # **框架自動加載實現流程** ## 1\. 首先載入loader.php文件 然后使用loader::register()進行自動加載 方法名中包含以下 ![](https://img.kancloud.cn/06/9c/069c81b9d7f1a0660bdfbb915908ebbb_607x240.png) ## 2\. register()方法中 ## 第一步使用sql\_autoload\_register()自動加載類 然后獲取到composer路徑并導入componser文件下的的auto\_static.php文件 auto\_static.php文件中 定義了兩個靜態屬性:prefixLengthPsr4和prefixDirsPsr4 ### prefixLengthPsr4 = array('t' => array('think\\componser' => 15),'a' => array('app'=>4)) ### prefixDirsPsr4 = array('think\\componser' =>array(0 => '/top/think/think-installer/src'),'app' =>array(0=>'/application')) ![](https://img.kancloud.cn/41/66/416695b83f385960caee526dd4bf72b1_708x537.png) 接下來 獲取到所有的類名數組 然后從使用array\_pop()數組中彈出最后一個數組 ![](https://img.kancloud.cn/8d/de/8ddeecff1d4d5311974815a2e694a862_664x102.png) Composer\Autoload\ComposerStaticInit25f893be97b63d60134b87b9c2e8987a 使用property_exists() 檢查遍歷的字符串是否在 上面的彈出的類數組中 ![](https://img.kancloud.cn/f1/68/f16803f91dc30aea18618015cab2fc4a_923x201.png) ![](https://img.kancloud.cn/52/e2/52e2ab34900edb6d8881f3f9fd11be75_647x117.png) ![](https://img.kancloud.cn/08/b9/08b926a1b0ab85a7a737f9559fec4b28_1586x384.png) ## 3. 注冊命名空間: ### 調用addNamespace() 參數是一個數組 參數是: array(2) { ["think"] =>string(57) "C:\Users\Administrator\Desktop\tp5\thinkphp\library\think" ["traits"] =>string(58) "C:\Users\Administrator\Desktop\tp5\thinkphp\library\traits"} ![](https://img.kancloud.cn/c3/bf/c3bfb5cb4ce5df86a80d4341042b4086_793x164.png) 在addNamespace中 又調用了addPsr4()參數是(上面的數組)并執行遍歷由原來的二維數組 遍歷成結果是一維數組 ![](https://img.kancloud.cn/af/fb/affb2acb1db9294781d04a8ed8011d04_971x342.png) addPsr4的方法作用是添加Psr4空間 因為傳過來的參數不為空 所以走流程如下圖所示: ![](https://img.kancloud.cn/b7/4a/b74a218645c740cc1ba5bf3962979c53_983x723.png) 因為沒有找到這個值 所以走這個邏輯: ![](https://img.kancloud.cn/8e/58/8e58103b1a2f9d7d4441f82378f6f0da_815x299.png) 最后就添加到了Psr4空間中 ![](https://img.kancloud.cn/86/4f/864f7e41ba2754b5d75499aee5e17e8e_770x95.png) ![](https://img.kancloud.cn/d9/4b/d94bda38eabe5b4502f5bb442ba44553_763x476.png) ## 4. 加載類庫映射文件 ### 調用addClassMap() 因為已經使用命令創建了類庫映射文件 所以走箭頭邏輯 ![](https://img.kancloud.cn/23/2f/232f1ea56c83e842e7ecd73562dba52d_492x61.png) ![](https://img.kancloud.cn/9d/eb/9debad8dfb3b6d0c6a82127d4cfadc9e_963x272.png) addClassMap()參數是剛生成的classMap.php文件內容 把類庫文件內容 賦值給**self::$classMap** ### 5. 自動加載extend目錄 ![](https://img.kancloud.cn/5f/80/5f8007a5381b56b730fef87c87c04ff1_638x105.png) 調用addAutoLoadDir()參數是extend的路徑 在addAutoLoadDir中 把路徑賦值給 **self::$fallbackDirsPsr4** ![](https://img.kancloud.cn/b3/41/b3415ad34df48e60eb2a8cffd55adf94_543x151.png) # -----------分割線----------- ## 注冊錯誤和異常處理機制 ![](https://img.kancloud.cn/93/08/93083537e5a03fd028582ff3f80d1e0a_643x235.png) ### 1。Error類沒有引用直接使用了 因此就出發了自動加載機制 就會自動調用Loader.php文件中的spl_autoload_register() ![](https://img.kancloud.cn/25/c1/25c1de8a3adc366fcabe298d2101968b_801x108.png) 就會調用autoload方法 ![](https://img.kancloud.cn/ad/72/ad7256f08f90f50d47d3a31c41f2e3e4_811x515.png) 在autoload中 先查看是否有別名 沒別名就調用findFile()去類庫文件查找 因為Error在類庫文件中找到了 如果找不到就去Psr-4中尋找 然后去查找 PSR-4 fallback dirs 然后查找 PSR-0 然后查找 PSR-0 fallback dirs一路查找 如果還沒找到 return **self::$classMap[$class]** = false; ![](https://img.kancloud.cn/bc/4a/bc4a0e9adf13d7353c45c13fea0f88be_779x520.png)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看