<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 自動加載器源代碼(thinkphp/library/think/Loader.php的加載器部分,其余的實例化部分分析見[另:自動加載器實例化](http://www.hmoore.net/zmwtp/tp5/120008)) ~~~ protected static $map = []; protected static $load = []; protected static $namespace = []; private static $prefixLengthsPsr4 = []; private static $prefixDirsPsr4 = []; private static $prefixesPsr0 = []; ~~~ ~~~ public static function autoload($class) { if (isset(self::$map[$class])) { if (is_file(self::$map[$class])) { APP_DEBUG && self::$load[] = self::$map[$class]; include self::$map[$class]; } } elseif ($file = self::findFileInComposer($class)) { APP_DEBUG && self::$load[] = $file; include $file; } else { if (!strpos($class, '\\')) { return; } list($name, $class) = explode('\\', $class, 2); if (isset(self::$namespace[$name])) { $path = self::$namespace[$name]; } elseif (is_dir(EXTEND_PATH . $name)) { $path = EXTEND_PATH . $name . DS; } else { return; } $filename = $path . str_replace('\\', DS, $class) . EXT; if (is_file($filename)) { if (APP_DEBUG && IS_WIN && false === strpos(realpath($filename), $class . EXT)) { return; } APP_DEBUG && self::$load[] = $filename; include $filename; } else { Log::record('autoloader error : ' . $filename, 'notice'); } } } ~~~ ~~~ public static function addMap($class, $map = '') { if (is_array($class)) { self::$map = array_merge(self::$map, $class); } else { self::$map[$class] = $map; } } ~~~ ~~~ public static function addNamespace($namespace, $path = '') { if (is_array($namespace)) { self::$namespace = array_merge(self::$namespace, $namespace); } else { self::$namespace[$namespace] = $path; } } ~~~ ~~~ public static function register($autoload = '') { spl_autoload_register($autoload ? $autoload : 'think\\Loader::autoload'); self::registerComposerLoader(); } private static function registerComposerLoader() { if (is_file(VENDOR_PATH . 'composer/autoload_namespaces.php')) { $map = require VENDOR_PATH . 'composer/autoload_namespaces.php'; foreach ($map as $namespace => $path) { self::$prefixesPsr0[$namespace[0]][$namespace] = (array) $path; } } if (is_file(VENDOR_PATH . 'composer/autoload_psr4.php')) { $map = require VENDOR_PATH . 'composer/autoload_psr4.php'; foreach ($map as $namespace => $path) { $length = strlen($namespace); if ('\\' !== $namespace[$length - 1]) { throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); } self::$prefixLengthsPsr4[$namespace[0]][$namespace] = $length; self::$prefixDirsPsr4[$namespace] = (array) $path; } } if (is_file(VENDOR_PATH . 'composer/autoload_classmap.php')) { $classMap = require VENDOR_PATH . 'composer/autoload_classmap.php'; if ($classMap) { self::addMap($classMap); } } if (is_file(VENDOR_PATH . 'composer/autoload_files.php')) { $includeFiles = require VENDOR_PATH . 'composer/autoload_files.php'; foreach ($includeFiles as $fileIdentifier => $file) { self::composerRequire($fileIdentifier, $file); } } } ~~~ ~~~ private static function composerRequire($fileIdentifier, $file) { if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) { require $file; $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true; } } ~~~ ~~~ private static function findFileInComposer($class, $ext = '.php') { $logicalPathPsr4 = strtr($class, '\\', DS) . $ext; $first = $class[0]; if (isset(self::$prefixLengthsPsr4[$first])) { foreach (self::$prefixLengthsPsr4[$first] as $prefix => $length) { if (0 === strpos($class, $prefix)) { foreach (self::$prefixDirsPsr4[$prefix] as $dir) { if (file_exists($file = $dir . DS . substr($logicalPathPsr4, $length))) { return $file; } } } } } if (false !== $pos = strrpos($class, '\\')) { $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) . strtr(substr($logicalPathPsr4, $pos + 1), '_', DS); } else { $logicalPathPsr0 = strtr($class, '_', DS) . $ext; } if (isset(self::$prefixesPsr0[$first])) { foreach (self::$prefixesPsr0[$first] as $prefix => $dirs) { if (0 === strpos($class, $prefix)) { foreach ($dirs as $dir) { if (file_exists($file = $dir . DS . $logicalPathPsr0)) { return $file; } } } } } return self::$map[$class] = false; } ~~~ ~~~ public static function import($class, $baseUrl = '', $ext = EXT) { static $_file = []; $class = str_replace(['.', '#'], [DS, '.'], $class); if (isset($_file[$class . $baseUrl])) { return true; } else { $_file[$class . $baseUrl] = true; } if (empty($baseUrl)) { list($name, $class) = explode(DS, $class, 2); if (isset(self::$namespace[$name])) { $baseUrl = self::$namespace[$name]; } elseif ('@' == $name || MODULE_NAME == $name) { $baseUrl = MODULE_PATH; } elseif (in_array($name, ['traits', 'think', 'behavior'])) { $baseUrl = LIB_PATH; } elseif (APP_NAMESPACE == $name) { $baseUrl = APP_PATH; } elseif (is_dir(EXTEND_PATH . $name)) { $baseUrl = EXTEND_PATH; } else { $baseUrl = APP_PATH . $name . DS; } } elseif (substr($baseUrl, -1) != DS) { $baseUrl .= DS; } $filename = $baseUrl . $class . $ext; if (is_file($filename)) { if (APP_DEBUG && IS_WIN && false === strpos(realpath($filename), $class . $ext)) { return false; } include $filename; return true; } return false; } ~~~ ## 2 分析 Loader.php是框架的類的自動加載實現文件。可以使用autoload()自動擋加載類,import()手動加載指定目錄的類。 `protected static $map = [];` 系統的類名映射緩存數組,在下面的addMap()使用 ` protected static $load = [];` 系統的加載列表緩存數組,在下面的autoload()使用 `protected static $namespace = [];` 系統的命名空間緩存數組,在下面的addNamespace()使用 ~~~ private static $prefixLengthsPsr4 = []; private static $prefixDirsPsr4 = []; ~~~ 系統的PSR-4緩存數組,在下面的registerComposerLoader()使用 `private static $prefixesPsr0 = [];` 系統的PSR-0緩存數組,在下面的registerComposerLoader()使用。 上面四個靜態變量用作加載器的緩存數組,保證加載效率。 * * * * * 1 autoload($class) 根據類名自動加載。 `public static function autoload($class){}` 使用類庫映射加載對應的類。 ~~~ if (isset(self::$map[$class])) { if (is_file(self::$map[$class])) { APP_DEBUG && self::$load[] = self::$map[$class]; include self::$map[$class]; } } ~~~ 使用composer加載類 ~~~ elseif ($file = self::findFileInComposer($class)) { APP_DEBUG && self::$load[] = $file; include $file; } ~~~ 根據命名空間自動加載類 ~~~ else { if (!strpos($class, '\\')) { return; } list($name, $class) = explode('\\', $class, 2); if (isset(self::$namespace[$name])) { $path = self::$namespace[$name]; } elseif (is_dir(EXTEND_PATH . $name)) { $path = EXTEND_PATH . $name . DS; } else { return; } $filename = $path . str_replace('\\', DS, $class) . EXT; if (is_file($filename)) { if (APP_DEBUG && IS_WIN && false === strpos(realpath($filename), $class . EXT)) { return; } APP_DEBUG && self::$load[] = $filename; include $filename; } else { Log::record('autoloader error : ' . $filename, 'notice'); } } ~~~ * * * * * 2 addMap($class,$map='') 注冊類名映射 `public static function addMap($class, $map = ''){}` 數組合并到$map,字符串關聯到$class. ~~~ if (is_array($class)) { self::$map = array_merge(self::$map, $class); } else { self::$map[$class] = $map; } ~~~ * * * * * 3 addNamespace($namespace,$path) 注冊命名空間和路徑的關聯 `public static function addNamespace($namespace, $path = ''){}` 數組合并到$namespace,字符串關聯到path. ~~~ if (is_array($namespace)) { self::$namespace = array_merge(self::$namespace, $namespace); } else { self::$namespace[$namespace] = $path; } ~~~ * * * * * 4 register($autoload='') 注冊自動加載機制 `public static function register($autoload = ''){}` think\Loader::autoload()系統自動加載 self::registerComposerLoader() composer自動加載 ~~~ spl_autoload_register($autoload ? $autoload : 'think\\Loader::autoload'); self::registerComposerLoader(); ~~~ 5 composer自動加載的注冊 `private static function registerComposerLoader(){}` 關于composer自動加載機制見 基礎原理的php的composer自動加載 * * * * * 6 composer自動加載的兩個私有方法 ~~~ private static function composerRequire($fileIdentifier, $file){} private static function findFileInComposer($class, $ext = '.php'){} ~~~ * * * * * 7 import($class,$baseUrl='',$ext=EXT) 手動加載$baseUrl下的$class命名的$ext后綴文件 `public static function import($class, $baseUrl = '', $ext = EXT){}` 首先分析$baseUrl, 然后查找$baserUrl.$class.$ext 文件名,然后加載對應文件 ## 3 總結 Loader類是系統的系統的自動加載類。 五個靜態變量用來緩存自動加載的結果。 addMap() addNamespace() 用來添加$map,$namespace的關聯信息。 register() 注冊自動加載機制 autoload() 自動加載類 import()手動加載類
                  <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>

                              哎呀哎呀视频在线观看