1. 程式人生 > >yii2初始化詳解 – 深究yii2 autoload機制

yii2初始化詳解 – 深究yii2 autoload機制

yii2採用的基於namespace的autoload機制,我們從初始化來參看yii2的autoload機制的整個過程,詳解yii的初始化過程

1.在入口檔案index.php我們可以看到程式碼:

  1. require(__DIR__ . '/../../vendor/autoload.php');

2.我們開啟這個檔案:

  1. <?php
  2. // autoload.php @generated by Composer
  3. require_once __DIR__ . '/composer' . '/autoload_real.php';
  4. return ComposerAutoloaderInit90def245ed1c6f870abec3fefcc03f88::
    getLoader();

可以看到載入了檔案/vendor/composer/autoload_real.php,開啟這個檔案,我們可以發現,裡面定義了一個php的class類:

ComposerAutoloaderInit90def245ed1c6f870abec3fefcc03f88

也就是呼叫了這個類的getLoader()方法。

3.找到這個方法getLoader()方法:下面是所有的程式碼:

  1. <?php
  2. // autoload_real.php @generated by Composer
  3. class ComposerAutoloaderInit90def245ed1c6f870abec3fefcc03f88
  4. {
  5. private static $loader;
  6. public static function loadClassLoader($class)
  7. {
  8. if('Composer\Autoload\ClassLoader' === $class){
  9. require __DIR__ . '/ClassLoader.php';
  10. }
  11. }
  12. public static function getLoader()
  13. {
  14. if(null !== self::$loader){
  15. return self::$loader;
  16. }
  17. spl_autoload_register(array('ComposerAutoloaderInit90def245ed1c6f870abec3fefcc03f88'
    , 'loadClassLoader'), true, true);
  18. self::$loader = $loader = new \Composer\Autoload\ClassLoader();
  19. spl_autoload_unregister(array('ComposerAutoloaderInit90def245ed1c6f870abec3fefcc03f88', 'loadClassLoader'));
  20. $map = require __DIR__ . '/autoload_namespaces.php';
  21. foreach($map as $namespace => $path){
  22. $loader->set($namespace, $path);
  23. }
  24. $map = require __DIR__ . '/autoload_psr4.php';
  25. foreach($map as $namespace => $path){
  26. $loader->setPsr4($namespace, $path);
  27. }
  28. $classMap = require __DIR__ . '/autoload_classmap.php';
  29. if($classMap){
  30. $loader->addClassMap($classMap);
  31. }
  32. $loader->register(true);
  33. $includeFiles = require __DIR__ . '/autoload_files.php';
  34. foreach($includeFiles as $file){
  35. composerRequire90def245ed1c6f870abec3fefcc03f88($file);
  36. }
  37. return $loader;
  38. }
  39. }
  40. function composerRequire90def245ed1c6f870abec3fefcc03f88($file)
  41. {
  42. require $file;
  43. }

首先我們看到的是spl_autoload_register這個方法,這個方法的作用是,在找不到類的情況下,通過這個函式定義的類方法去找,通過傳遞的引數,返回載入的類的路徑。也就是說,當找不到類的時候,就通過這個方法找:

  1. public static function loadClassLoader($class)
  2. {
  3. if('Composer\Autoload\ClassLoader' === $class){
  4. require __DIR__ . '/ClassLoader.php';
  5. }
  6. }

因此這段程式碼  self::$loader = $loader = new \Composer\Autoload\ClassLoader();

載入的檔案是vendor/composer/ClassLoader.php

4.然後通過這個類的方法,載入很多初始路徑:

  1. $map = require __DIR__ . '/autoload_namespaces.php';
  2. foreach($map as $namespace => $path){
  3. $loader->set($namespace, $path);
  4. }
  5. $map = require __DIR__ . '/autoload_psr4.php';
  6. foreach($map as $namespace => $path){
  7. $loader->setPsr4($namespace, $path);
  8. }
  9. $classMap = require __DIR__ . '/autoload_classmap.php';
  10. if($classMap){
  11. $loader->addClassMap($classMap);
  12. }
  13. $loader->register(true);
  14. $includeFiles = require __DIR__ . '/autoload_files.php';
  15. foreach($includeFiles as $file){
  16. composerRequire90def245ed1c6f870abec3fefcc03f88($file);
  17. }
  18. return $loader;

4.1通過set  setPsr4  addClassMap等方法進行namespace路徑初始化。 這個對應的檔案是/autoload_psr4.php , 這個檔案裡面是對yii2的外掛的namespace的定義:

  1. <?php
  2. // autoload_psr4.php @generated by Composer
  3. $vendorDir = dirname(dirname(__FILE__));
  4. $baseDir = dirname($vendorDir);
  5. return array(
  6. 'yii\\swiftmailer\\' => array($vendorDir . '/yiisoft/yii2-swiftmailer'),
  7. 'yii\\redis\\' => array($vendorDir . '/yiisoft/yii2-redis'),
  8. 'yii\\gii\\' => array($vendorDir . '/yiisoft/yii2-gii'),
  9. 'yii\\faker\\' => array($vendorDir . '/yiisoft/yii2-faker'),
  10. 'yii\\debug\\' => array($vendorDir . '/yiisoft/yii2-debug'),
  11. 'yii\\composer\\' => array($vendorDir . '/yiisoft/yii2-composer'),
  12. 'yii\\codeception\\' => array($vendorDir . '/yiisoft/yii2-codeception'),
  13. 'yii\\bootstrap\\' => array($vendorDir . '/yiisoft/yii2-bootstrap'),
  14. 'yii\\' => array($vendorDir . '/yiisoft/yii2'),
  15. 'fecadmin\\' => array($vendorDir . '/fancyecommerce/fec_admin'),
  16. 'fec\\' => array($vendorDir . '/fancyecommerce/fec'),
  17. 'cebe\\markdown\\' => array($vendorDir . '/cebe/markdown'),
  18. 'Faker\\' => array($vendorDir . '/fzaninotto/faker/src/Faker'),
  19. );

定義各個外掛的根路徑。

4.2autoload_classmap.php 這個目前為空,沒有細緻研究具體內部的存放

4.3/autoload_files.php

  1. <?php
  2. // autoload_files.php @generated by Composer
  3. $vendorDir = dirname

    相關推薦

    yii2初始深究yii2 autoload機制

    yii2採用的基於namespace的autoload機制,我們從初始化來參看yii2的autoload機制的整個過程,詳解yii的初始化過程 1.在入口檔案index.php我們可以看到程式碼: require(__DIR__ . '/../../vendor/autoload.php'); 2.我

    “全棧2019”Java第五十二章:繼承與初始

    難度 初級 學習時間 10分鐘 適合人群 零基礎 開發語言 Java 開發環境 JDK v11 IntelliJ IDEA v2018.3 文章原文連結 “全棧2019”Java第五十二章:繼承與初始化詳解 下一章 “全棧2019”Java第五十三章:向上轉型和向下轉型

    java陣列初始

    一維陣列 1)   int[] a;   //宣告,沒有初始化 2)   int[] a=new int[5];   //初始化為預設值,int型為0 3)   int[] a={1,2,3,4,5};   //初始化為給定值 4)   int[] a=new in

    Java final欄位的初始

    JAVA的final關鍵詞可以用在三方面,一是欄位,二是方法,三是類,本文主要討論final欄位的幾種初始化方法. 首先用我個人通俗語言來解釋一下final欄位的意思,就是final如果初始化值,就不允許對它進行賦值運算,不允許再修改它的值了,JAVA術語叫final欄位為常量. 注:本文的示例程式碼都沒有寫

    靜態程式碼初始

    大家都知道在JavaSE 中程式的run 都是在JVM中進行的,刨除反射,幾乎所有的方法的執行都需要new 一下 也就是new 一個物件。“你有物件嗎?new 一個啊”。 new 的過程就是在堆中開闢

    Linux下串列埠通訊(上)開啟串列埠和串列埠初始

    linux下串列埠通訊主要有下面幾個步驟 串列埠通訊流程圖 下面我會一一介紹這幾個步驟。 1.開啟串列埠 程式碼(串列埠為ttyUSB0) //開啟串列埠 int open_port(void) { int fd; fd=open("/dev/ttyUSB0

    【Spring MVC】HandlerMapping初始(超詳細過程原始碼分析)

    Spring MVC的Control主要由HandlerMapping和HandlerAdapter兩個元件提供。HandlerMapping負責對映使用者的URL和對應的處理類,HandlerMapping並沒有規定這個URL與應用的處理類如何對映,在HandlerMapp

    [轉發][純記錄]raid組的初始

    本文轉載自http://www.osslab.org.tw/Storage/Enterprise/SAS%E8%88%87RAID/RAID_Technology_Articles/Initializtion_Function A RAID controller e

    Dubbo配置屬性初始

            在前面的文章中,我們講解了Dubbo是如何建立Provider Bean的(Dubbo之provider bean

    Yii2頁面快取

    頁面快取指的是在伺服器端快取整個頁面的內容。隨後當同一個頁面 被請求時,內容將從快取中取出,而不是重新生成。 舉例說明 class TestController extends Controller{     // 該方法會在其他方法之前執行   

    yii2-redis 擴充套件

    'cache' => [ //'class' => 'yii\caching\FileCache', 'class' => 'yii\redis\Cache', ], 'redis' => [ 'class' => '

    Yii2.0登入(下)

    在上一篇博文中,筆者講述了yii2應用使用者登陸的基本方法,但是這些方法到底是怎樣實現登陸的呢?底層的原理到底是什麼?在這篇博文筆者將從Yii的原始碼角度分析登陸的基本原理以及cookie自動登陸的原理,通過原始碼的分析,各位對Yii的理解也會更上一層樓。 一、第一次

    Yii2 RabbitMQ 使用

    PHP雖然在普通訊息佇列中表現不算特別好,但是因為其輕便簡單作為客戶端來接收其他語言指令碼處理後的訊息再作為服務端傳給js客戶端也是很常見的,所以PHP訊息佇列的使用還是很重要。 這裡注意的是還有叫yii2-amqp的包,這些直接通過comp

    Yii2片段快取

    概述 這裡只是簡單講一下用法,如果想更詳細的瞭解,去看 官方手冊 比較好。 片段快取指的是快取頁面內容中的某個片段。例如,一個頁面顯示了逐年銷售額的摘要表格, 可以把表格快取下來,以消除每次請求都要重新生成表格 的耗時。片段快取是基於資料快取實現的。

    HIVE之正則

    div case details class null false TP CA hive 有大神寫的很好了,我借花獻佛,有興趣,看鏈接,在此不再贅述。想要學習Hive正則表達式重點應該是正則表達式的表示方式,只有正則表達式使用溜了,hive正則那就是小case. 附參考博文

    LRN 區域性響應歸一

    1、其中LRN就是區域性響應歸一化: 這個技術主要是深度學習訓練時的一種提高準確度的技術方法。其中caffe、tensorflow等裡面是很常見的方法,其跟啟用函式是有區別的,LRN一般是在啟用、池化後進行的一中處理方法。         &nbs

    java 物件的序列

    序列化 物件序列化的目標是將物件儲存到磁碟中,或者允許在網路中直接傳輸物件。物件序列化機制允許把記憶體中的JAVA物件轉換成跟平臺無關的二進位制流,從而允許將這種二進位制流持久地儲存在磁碟上,通過網路將這種二進位制流傳輸到另一個網路節點,其他程式一旦獲得了這種二進位制流,都可以講二進位制流恢復成

    離散

     本來應該是很簡單的東西,但是之前學長講的時候也沒怎麼聽,然後現在遇到需要離散化的題目就有點茫然了。看了下網上大佬們的部落格,基本理解了,做個記錄。   以下內容部分思路來自:   https://blog.csdn.net/xiangaccepted/article/details

    物件序列

    前言 我們在做web專案的時候,在網路傳輸中,序列化是繞不過去的重要一環。今天就來總結一下序列化到底能為我們做些什麼 概念 序列化機制:允許把記憶體中的Java物件轉換成平臺無關的二進

    動態代理模式(例項

    簡介 代理模式通常用於達到對原有系統功能進行擴充的目的 比如:你剛接手一個別人沒有完成的專案,這是你不想動別人原理的程式碼,還需要新增新功能。這時代理模式,這時代理模式,這時代理模式會很好的幫助解決問題 代理模式分為兩種: 靜態代理模式 、 動態代理模式 靜態代理 靜態代理一般是