• <button id="kwi2e"></button>
  • <bdo id="kwi2e"><meter id="kwi2e"></meter></bdo><li id="kwi2e"><meter id="kwi2e"><th id="kwi2e"></th></meter></li>
  • <center id="kwi2e"><optgroup id="kwi2e"></optgroup></center>
      <small id="kwi2e"><delect id="kwi2e"></delect></small><span id="kwi2e"><table id="kwi2e"></table></span>
      <bdo id="kwi2e"><meter id="kwi2e"><bdo id="kwi2e"></bdo></meter></bdo><bdo id="kwi2e"><meter id="kwi2e"></meter></bdo>

      淺談 thinkphp composer 擴展包加載原理 環(huán)球視訊

      時間:2023-06-14 22:21:52
      淺談 thinkphp composer 擴展包加載原理本文將介紹 ThinkPHP 中 Composer 擴展包的加載原理,幫助讀者更好地理解和應(yīng)用該功能。前言

      如題,今天感覺好久沒有更新博客了。最近迷上了物聯(lián)網(wǎng)開發(fā)。一直在研究stm32、51這些東西。想起來前幾天群里面有人問到tp擴展包原理。其實這個前幾年也就研究過。網(wǎng)上搜了搜發(fā)現(xiàn)相關(guān)文章也很少(也有可能是我搜索姿勢不對)今天就來寫一篇thinkphp composer包加載原理

      概覽當進行 composer update或者 composer require操作時。則會執(zhí)行service:discover這個命令。把當前所有已經(jīng)加載的庫信息都進行一次匹配。如果匹配到了think關(guān)鍵字的services屬性。則把服務(wù)類輸出成配置文件到vendor/services.php文件中當一次應(yīng)用初始化(通常為一次訪問開始時).則會引入vendor/services.php中的service服務(wù)類到當前應(yīng)用內(nèi)進行初始化源碼解析composer包加載流程文字詳解 建議先閱讀一下這篇前兩年我寫的文章 Thinkphp6源碼解析之分析 路由篇-請求流程

      在第三步進入到Http->runWithRequest這個方法中后。可以看到又調(diào)用了initialize方法

      追進這個方法可以看到


      (資料圖片)

      追進initialize方法看實現(xiàn)

      /**     * 初始化應(yīng)用     * @access public     * @return $this     */    public function initialize()    {        // 設(shè)置當前初始化狀態(tài)        $this->initialized = true;                // 設(shè)置應(yīng)用開始時間        $this->beginTime = microtime(true);                // 獲取到php的內(nèi)存        $this->beginMem  = memory_get_usage();        // 加載環(huán)境變量 例如當前應(yīng)用目錄下的 .env文件        $this->loadEnv($this->envName);        // 設(shè)置配置文件后綴        $this->configExt = $this->env->get("config_ext", ".php");                // 調(diào)試模式設(shè)置        $this->debugModeInit();        // 加載全局初始化文件        $this->load();        // 加載應(yīng)用默認語言包        $this->loadLangPack();        // 監(jiān)聽AppInit        $this->event->trigger(AppInit::class);                // 設(shè)置php默認時區(qū)        date_default_timezone_set($this->config->get("app.default_timezone", "Asia/Shanghai"));        // 初始化當前系統(tǒng)配置的默認服務(wù)        foreach ($this->initializers as $initializer) {// 調(diào)用make函數(shù)生成對象。并且執(zhí)行對象中的init方法            $this->make($initializer)->init($this);        }        return $this;    }

      重點是初始化當前系統(tǒng)配置的默認服務(wù)這個$this->make($initializer)->init($this)函數(shù),看看initializers屬性

      /**     * 應(yīng)用初始化器     * @var array     */    protected $initializers = [        Error::class,        RegisterService::class,        BootService::class,    ];

      追到這里就是關(guān)鍵了。上面把這里面的類進行初始化。并且執(zhí)行類中的init方法。直接看RegisterService::class類的init方法

      public function init(App $app)    {        // 獲取當前項目根目錄。拼接上 vendor/services.php        $file = $app->getRootPath() . "vendor/services.php";        $services = $this->services;        if (is_file($file)) {            $services = array_merge($services, include $file);        }        // 初始化services        foreach ($services as $service) {            if (class_exists($service)) {                $app->register($service);            }        }    }

      讀到這里的可以看看自己項目vendor目錄下是不是有一個services.php,接下來講一講composer.json這個文件在tp框架中的composer.json有這樣一個配置

      這里這個概念我直接讓chatgpt來解讀。解讀內(nèi)容如下

      接下來直接看service:discover這個命令。追到vendor\topthink\framework\src\think\console\command\ServiceDiscover.php文件

      public function execute(Input $input, Output $output)    {        // 獲取到當前項目根目錄下的 vendor/composer/installed.json 文件        if (is_file($path = $this->app->getRootPath() . "vendor/composer/installed.json")) {            // json解析            $packages = json_decode(@file_get_contents($path), true);            // Compatibility with Composer 2.0            if (isset($packages["packages"])) {                $packages = $packages["packages"];            }            $services = [];            foreach ($packages as $package) {                // 判斷當前包是否在extra字段里面聲明了think關(guān)鍵字中的services屬性。如果聲明了就把services給裝載到services變量內(nèi)                if (!empty($package["extra"]["think"]["services"])) {                    $services = array_merge($services, (array) $package["extra"]["think"]["services"]);                }            }            $header = "http:// This file is automatically generated at:" . date("Y-m-d H:i:s") . PHP_EOL . "declare (strict_types = 1);" . PHP_EOL;            // 用var_export函數(shù)把services變量打印成可讀性代碼。并且寫入到根目錄vendor目錄下的services            $content = "app->getRootPath() . "vendor/services.php", $content);            $output->writeln("Succeed!");        }

      一直到這就算結(jié)束了

      寫在最后

      如果覺得這篇文章對你有幫助。不妨點個贊留個關(guān)注再走

      標簽:

      來源:博客園
      0
      上一篇:貴陽香菇肉丁最正宗的做法?_今日熱文 下一篇:最后一頁

      最近更新

        Copyright @ 2001-2013 m.yw384.com All Rights Reserved 財經(jīng)新聞網(wǎng) 版權(quán)所有 京ICP備12018864號-1

        網(wǎng)站所登新聞、資訊等內(nèi)容, 均為相關(guān)單位具有著作權(quán),轉(zhuǎn)載請注明出處

        未經(jīng)彩迅新聞網(wǎng)書面授權(quán),請勿建立鏡像 聯(lián)系我們:  291 32 36@qq.com

      營業(yè)執(zhí)照公示信息

       

      主站蜘蛛池模板: 色综合视频一区二区三区44| 中文字幕亚洲综合久久2| 久久精品综合电影| 亚洲精品天天影视综合网| 97久久综合精品久久久综合| 国产成人亚洲综合色影视| 色狠狠色狠狠综合一区| 久久久久久久综合综合狠狠| 天堂无码久久综合东京热| 综合自拍亚洲综合图不卡区| 99v久久综合狠狠综合久久| 色综合伊人色综合网站| 色综合久久夜色精品国产| 美腿丝袜亚洲综合| 婷婷久久综合九色综合绿巨人| 色诱久久久久综合网ywww| 亚洲狠狠爱综合影院婷婷| 色噜噜久久综合伊人一本| 亚洲综合无码一区二区| 精品国产国产综合精品 | 色综合久久中文色婷婷| 久久婷婷色综合一区二区| 色噜噜狠狠狠狠色综合久| 国产精品亚洲综合| 97久久久精品综合88久久| 99久久综合狠狠综合久久一区| 久久综合伊人77777麻豆| 亚洲国产综合精品中文字幕 | 欧洲 亚洲 国产图片综合| 亚洲综合一区二区精品导航| 亚洲亚洲人成综合网络| 伊人久久大香线蕉综合电影| 少妇熟女久久综合网色欲| 国产综合成人色产三级高清在线精品发布 | 亚洲AV成人潮喷综合网| 成人综合在线视频| 国产成人综合精品一区| 图图资源网亚洲综合网站| 亚洲综合久久1区2区3区| 麻豆久久婷婷五月综合国产| 丁香五月缴情综合网|