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

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # composer機制 > *Composer*?是 PHP 中用來管理依賴(dependency)關系的工具,它可以幫我們自動加載類文件(前提是定義好命名空間和目錄的映射關系),并且是惰性加載,在使用類時才自動加載,而不是一開始就加載全部類文件 ## 1. 魔術方法__autoload 當類不存在時,自動加載類文件(前提是自己需要自己定義好類和類文件的映射規則) ### 1.1 為什么不用__autoload *__autoload*是全局函數,只能定義一次,所有類和類文件映射規則只能在*\_\_autoload*函數定義,會造成*\_\_autoload*臃腫 ## 2. spl_autoload_register *spl_authoload_register*是__autoload的調用堆棧,可以定義多個*spl_authoload_register*,不同的映射的規則定義到*spl_authoload_register*中 ## 3. PSR-4 *PSR-4*規范了如何指定文件路徑從而自動加載類定義,同時規范了自動加載文件的位置 ### 3.1 PSR-4和PSR-0的區別 *psr-4*和*psr-0*都可以自動加載類,兩者的區別如下: #### 3.1.1 psr-0有更深的目錄 例如我們使用use church\testClass,composer.json定義如下 ```json # psr-0 { "autoload": { "psr-0": { "church\\": "./src/" } } } # psr-4 { "autoload": { "psr-4": { "church\\": "./src/" } } } ``` - psr-0對應類文件為:./src/church/testClass.php - psr-4對應類文件為:./src/testClass.php #### 3.1.2 psr-4命名空間要求“/”結尾 ```json { "autoload": { "psr-4": { "church\\": "./src/" } } } ``` church命名空間必須以方斜杠\結尾,否則報錯如下: ```bash [InvalidArgumentException] A non-empty PSR-4 prefix must end with a namespace separator. ``` #### 3.1.3 psr-4下劃線無意義(沒搞懂) psr-4下劃線無意義,而psr-0類名有下劃線,則會轉為斜杠/ ## 4. composer機制 ### 4.1 疑問 什么時候去解析composer.json文件,如何解析composer.json文件? > 應該是在composer update,composer install時會根據composer.json定義的autoload屬性,自動保存映射關系到對應文件 ### 4.2 源碼 #### 4.2.1 實例化核心加載類 Composer\Autoload\ClassLoader #### 4.2.2 設置ClassLoader屬性 設置prefixLengthsPsr4, prefixDirsPsr4, prefixesPsr0,如下有兩種方式,一種是直接在autoload_static.php讀取,另一種是通過autoload_namespaces.php,autoload_psr4.php,autoload_classmap.php讀取 ```php $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded()); if ($useStaticLoader) { require_once __DIR__ . '/autoload_static.php'; call_user_func(\Composer\Autoload\ComposerStaticInitc9aa9b19e38ff570843aae65d73b4f16::getInitializer($loader)); } else { $map = require __DIR__ . '/autoload_namespaces.php'; foreach ($map as $namespace => $path) { $loader->set($namespace, $path); } $map = require __DIR__ . '/autoload_psr4.php'; foreach ($map as $namespace => $path) { $loader->setPsr4($namespace, $path); } $classMap = require __DIR__ . '/autoload_classmap.php'; if ($classMap) { $loader->addClassMap($classMap); } } ``` #### 4.2.3 注冊到spl_autoload_register調用堆棧 ```php $loader->register(true); public function register($prepend = false) { spl_autoload_register(array($this, 'loadClass'), true, $prepend); } ``` #### 4.2.4 類和文件映射規則 ```php private function findFileWithExtension($class, $ext) { // PSR-4 lookup $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; $first = $class[0]; if (isset($this->prefixLengthsPsr4[$first])) { $subPath = $class; while (false !== $lastPos = strrpos($subPath, '\\')) { $subPath = substr($subPath, 0, $lastPos); $search = $subPath . '\\'; if (isset($this->prefixDirsPsr4[$search])) { $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1); foreach ($this->prefixDirsPsr4[$search] as $dir) { if (file_exists($file = $dir . $pathEnd)) { return $file; } } } } } // PSR-4 fallback dirs foreach ($this->fallbackDirsPsr4 as $dir) { if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { return $file; } } // PSR-0 lookup if (false !== $pos = strrpos($class, '\\')) { // namespaced class name $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); } else { // PEAR-like class name $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; } if (isset($this->prefixesPsr0[$first])) { foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { if (0 === strpos($class, $prefix)) { foreach ($dirs as $dir) { if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { return $file; } } } } } // PSR-0 fallback dirs foreach ($this->fallbackDirsPsr0 as $dir) { if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { return $file; } } // PSR-0 include paths. if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { return $file; } return false; } ``` 大概過程如下:prefixLengthsPsr4 -> prefixDirsPsr4 -> fallbackDirsPsr4 ### 4.3 使用 ### 4.3.1 初始化composer ```bash php composer.phar init ``` ### 4.3.2 編輯composer.json,添加自己的命名空間和全局函數 ```json # composer.json中的autoload鍵 "autoload": { "psr-4": { "App\\": "app/" }, "files": [ "app/Swoft.php", "app/Helper/Functions.php" ], "classmap": [ "src/" ] }, ``` - psr-4命名空間,保存在autoload_psr4.php文件中 - files全局函數,保存在autoload_files.php文件中 - classmap掃描src所有文件,以namespace+classname作為鍵,文件作為值,保存在autoload_classmap.php文件中 ##### 注意:修改composer.json后,需要composer update ## 4.3.3 composer常用命令 ```bash # 安裝 php7 composer.phar require wuzhc/zcswoole -vvv # 卸載 php7 composer.phar remove wuzhc/zcswoole -vvv # 創建項目 composer create-project --prefer-dist yiisoft/yii2-app-advanced yii-application ``` ### 參數說明 - `--prefer-dist` 會從github 上下載.zip壓縮包,并緩存到本地。下次再安裝就會從本地加載,大大加速安裝速度。但她沒有保留 .git文件夾,沒有版本信息。適合基于這個package進行開發。 - `--prefer-source` 會從github 上clone 源代碼,不會在本地緩存。但她保留了.git文件夾,從而可以實現版本控制。適合用于修改源代碼。 ## 5. 參考 [深入解析 composer 的自動加載原理](https://segmentfault.com/a/1190000014948542#articleHeader10)
                  <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>

                              哎呀哎呀视频在线观看