摘要:今天來寫寫這個框架的類加載機制版本原理在項目啟動時,通過注冊了要使用的類的自動加載處理方法,在類第一次被使用的時候,類文件通過該方法被引入,然后類才得以使用源碼分析在的入口文件,我們找到我們隨著這個路徑我們找打了這個主要內容如下其中是為了注
今天來寫寫Symfony2.8 這個框架的類加載機制
版本原理Symfony 2.8
在項目啟動時,Symfony 通過spl_autoload_register 注冊了要使用的類的自動加載處理方法, 在類第一次被使用的時候, 類文件通過該方法被引入, 然后類才得以使用
源碼分析1.在symfony的入口文件, 我們找到
#web/app_dev.php or web/app.php $loader = require __DIR__."/../app/autoload.php"
2.我們隨著這個路徑,我們找打了這個autoload.php, 主要內容如下:
# app/autoload.php $loader = require __DIR__."/../vendor/autoload.php"; AnnotationRegistry::registerLoader(array($loader, "loadClass")); return $loader;
其中
$loader = require __DIR__."/../vendor/autoload.php";
是為了注冊symfony的核心類的自動加載方法
AnnotationRegistry::registerLoader(array($loader, "loadClass"));
這個應該是為了用戶配置自定義的類的自動加載配置,暫時不看
3.我們再根據$loader 找到對應的autoload.php
# vendor/autoload.php require_once __DIR__ . "/composer" . "/autoload_real.php"; return ComposerAutoloaderInit447e0408cbcbbdf0d6df9a85eb1d2ead::getLoader();
這里的getLoader()函數就是在autoload_real.php定義的,我們繼續深入這個文件
4.找到autoload_real.php
# vendor/composer/autoload_real.php
我們找打getLoader 函數, 在這里, 我加入了一些代注釋, 方便理解
public static function getLoader() { if (null !== self::$loader) { return self::$loader; } //這里注冊的自動加載處理函數僅僅是為了能加載 ComposerAutoloadClassLoader spl_autoload_register(array("ComposerAutoloaderInit447e0408cbcbbdf0d6df9a85eb1d2ead", "loadClassLoader"), true, true); self::$loader = $loader = new ComposerAutoloadClassLoader(); //$loader 才是實際的要加載的自動加載處理類 //得到自動加載處理類后ComposerAutoloadClassLoader就不需要了 spl_autoload_unregister(array("ComposerAutoloaderInit447e0408cbcbbdf0d6df9a85eb1d2ead", "loadClassLoader")); //以下是注冊 命名空間與命名空間下的類文件的目錄的映射關系 //或者注冊類名與類文件的路徑的映射關系 $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); } //該函數真正執行了`spl_autoload_register` $loader->register(true); //處理composer 的類加載 $includeFiles = require __DIR__ . "/autoload_files.php"; foreach ($includeFiles as $fileIdentifier => $file) { composerRequire447e0408cbcbbdf0d6df9a85eb1d2ead($fileIdentifier, $file); } return $loader; }
打開autoload_namespaces.php,autoload_psr4.php,autoload_classmap.php, 我們可以看到的是其中保存的是命名空間與命名空間下的類文件存儲的目錄的映射關系,或者是類名稱與類文件路徑的映射關系
實際上, 這種映射關系為后面的類文件定位提供直接的查詢幫助,ClassLoader 注冊(記錄)了這種映射關系, 再將其loadClass 注冊為自動加載處理函數(執行$loader->register(true);時), 最后,我們再使用到類的時候, 根據類名或者類的命名空間,到已經注冊了的映射關系可以直接定位到類文件, 將其include 我們就實現了所謂的自動加載
總結以上就是Symfony2.8 的內核類的自動加載的處理
這是第一次寫框架源碼分析, 比較粗糙, 如果各位有疑問, 請及時指出
另外, 這個分析只能作為大家研究symfony源碼的參考,一定要對著源碼一塊看才能理解,切忌僅僅通過直接閱讀本文就能理解
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/21801.html
摘要:環境說明操作系統安裝準備均使用安裝至少要有個的環境是少不了了安裝步驟下載官方命令工具創建項目這里執行項目創建時,會從官網下載源碼包,執行完后就能在當前目錄看到了這里我創建了一個新的項目叫,最后的不是項目名字中的是要下載指定的版本的源 環境說明 操作系統 tony@ubuntu:~$ lsb_release -a No LSB modules are available. Distrib...
閱讀 2082·2021-11-24 09:39
閱讀 1536·2021-10-11 10:59
閱讀 2489·2021-09-24 10:28
閱讀 3367·2021-09-08 09:45
閱讀 1263·2021-09-07 10:06
閱讀 1657·2019-08-30 15:53
閱讀 2056·2019-08-30 15:53
閱讀 1411·2019-08-30 15:53