<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>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                [TOC] * * * * * ## 1 加載器接口 ### 加載器初始化 >[info] 注冊加載器函數 `public static function register($autoload = '')` > $autoload: 加載器函數 默認為Loader::autoload() * * * * * ### 注冊命名空間/類名別名 >[info] 注冊命名空間別名 `public static function addNamespace($namespace, $path = '')` > $namespace:待注冊命名空間 > $path:待注冊命名空間對應目錄 * * * * * >[info] 注冊類名別名 `public static function addMap($class, $map = '')` > $class:待注冊類名 > $map:待注冊類名對應別名 * * * * * ### 加載文件 >[info] 類Java加載函數 `public static function import($class, $baseUrl = '', $ext = EXT) ` > $class:加載的類名 > $baseUrl:加載的類文件目錄 > $ext:加載的文件后綴 * * * * * >[info] 類自動加載 `public static function autoload($class) ` > $class:加載的類名 ## 2 加載器原理 ### 加載器初始化 Loader::rigister() `spl_autoload_register($autoload ? $autoload : 'think\\Loader::autoload');` 注冊系統自動加載$autolaod `self::registerComposerLoader();` 注冊composer自動加載 * * * * * >[info] composer自動加載注冊 Loader::registerComposerLoader() composer自動加載原理見 [php的自動加載](http://www.hmoore.net/zmwtp/tp5/119447#4-composer-) `if (is_file(VENDOR_PATH . 'composer/autoload_namespaces.php')) {}` composer/autoload_namespaces.php注冊到self::$prefixesPsr0 `if (is_file(VENDOR_PATH . 'composer/autoload_psr4.php')) {}` composer/autoload_psr4.php注冊到self::$prefixDirsPsr4[$namespace] `if (is_file(VENDOR_PATH . 'composer/autoload_classmap.php')) {}` composer/autoload_classmap.php注冊到self::$map `if (is_file(VENDOR_PATH . 'composer/autoload_files.php')) {}` composer/autoload_files.php中文件依次加載 ### 命名空間與目錄關系注冊 Loader::addNamespace() `self::$namespace = array_merge(self::$namespace, $namespace);` $namespae為 array('namespace1'=>'path1','namespace2'=>'path2'), $path為空時,將$namespace合并到self::$namespace。 `self::$namespace[$namespace] = $path;` 兩個參數則注冊$namespace與$path到self::$namespace ### 類名與文件關系注冊 Loader::addMap() `self::$map = array_merge(self::$map, $class);` $class為array('class1'=>'map1','class2'=>'map2') $map為空時,將$class合并到self::$map。 `self::$map[$class] = $map;` 兩個參數注冊$class與$map關聯到self::$map ### 文件自動加載 Loader::autoload() `if (isset(self::$map[$class])) {}` 首先檢查類別名對應的類文件, 如果存在,則加載對應類文件 `elseif ($file = self::findFileInComposer($class)) {}` 次之使用Composer加載對應類文件 `else {}` 最后解析類名中的命名空間,類到對應文件,并加載 ### 文件手動加載 Loader::import() `static $_file = [];` 手動加載文件的全局緩存數組 $class參數解析: `$class = str_replace(['.', '#'], [DS, '.'], $class);` 將$class參數中的符號"." "#"解析為目錄分隔符, ~~~ if (isset($_file[$class . $baseUrl])) { return true; } else { $_file[$class . $baseUrl] = true; } ~~~ 檢查$_file全局緩存數組是否已加載。 $baseUrl參數解析: `if (empty($baseUrl)) {}else{}` 檢查是否添加$baseUrl參數。 `list($name, $class) = explode(DS, $class, 2);` 將$class以目錄分割符分解為到目錄名$name,文件名$class變量中 ~~~ if (isset(self::$namespace[$name])) { $baseUrl = self::$namespace[$name]; } ~~~ $name對應的目錄已注冊到$namespace,獲取對應目錄。 ~~~ elseif ('@' == $name || MODULE_NAME == $name) { $baseUrl = MODULE_PATH; } ~~~ $name為@或者MODULE_NAME,獲取對應模塊目錄。 `elseif (in_array($name, ['traits', 'think', 'behavior']))` $name為traits,think,behavior等根命名空間,獲取對應目錄 `elseif (APP_NAMESPACE == $name) ` $name為應用命名空間,獲取應用目錄 `elseif (is_dir(EXTEND_PATH . $name))` $name為框架擴展目錄,獲取擴展目錄 ~~~ else { $baseUrl = APP_PATH . $name . DS; } ~~~ $name為應用的$name的目錄 ~~~ elseif (substr($baseUrl, -1) != DS) { $baseUrl .= DS; } ~~~ $baseUrl參數存在,則解析為$baserUlr目錄 `$filename = $baseUrl . $class . $ext;` 根據$baseUrl,$class,$ext合成目標文件名 ~~~ if (is_file($filename)) { if (APP_DEBUG && IS_WIN && false === strpos(realpath($filename), $class . $ext)) { return false; } include $filename; return true; } ~~~ 對應目標文件存在,加載對應目標文件。 ## 3 加載器框架示例 ~~~ thinkphp\start.php Loader::register(); if (isset($mode['namespace'])) { Loader::addNamespace($mode['namespace']); } if (isset($mode['alias'])) { Loader::addMap(is_array($mode['alias']) ? $mode['alias'] : include $mode['alias']); } ~~~ ~~~ thinkphp\library\think\App::run() if (!empty($config['root_namespace'])) { Loader::addNamespace($config['root_namespace']); } ~~~ ~~~ thinkphp\library\think\App::initModule() if (is_file($path . 'alias' . EXT)) { Loader::addMap(include $path . 'alias' . EXT); } ~~~
                  <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>

                              哎呀哎呀视频在线观看