国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Symfony2.8 源碼分析之類的加載

Blackjun / 527人閱讀

摘要:今天來寫寫這個框架的類加載機制版本原理在項目啟動時,通過注冊了要使用的類的自動加載處理方法,在類第一次被使用的時候,類文件通過該方法被引入,然后類才得以使用源碼分析在的入口文件,我們找到我們隨著這個路徑我們找打了這個主要內容如下其中是為了注

今天來寫寫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

相關文章

  • Linux 安裝 Symfony2.8

    摘要:環境說明操作系統安裝準備均使用安裝至少要有個的環境是少不了了安裝步驟下載官方命令工具創建項目這里執行項目創建時,會從官網下載源碼包,執行完后就能在當前目錄看到了這里我創建了一個新的項目叫,最后的不是項目名字中的是要下載指定的版本的源 環境說明 操作系統 tony@ubuntu:~$ lsb_release -a No LSB modules are available. Distrib...

    Yang_River 評論0 收藏0
  • Java開發

    摘要:大多數待遇豐厚的開發職位都要求開發者精通多線程技術并且有豐富的程序開發調試優化經驗,所以線程相關的問題在面試中經常會被提到。將對象編碼為字節流稱之為序列化,反之將字節流重建成對象稱之為反序列化。 JVM 內存溢出實例 - 實戰 JVM(二) 介紹 JVM 內存溢出產生情況分析 Java - 注解詳解 詳細介紹 Java 注解的使用,有利于學習編譯時注解 Java 程序員快速上手 Kot...

    LuDongWei 評論0 收藏0
  • 編程語言分類

    摘要:轉載轉載目前編程語言可以分為兩大類第一類是像,,之類的編譯型語言,它們的共性是運行之前必須對源代碼進行編譯,然后運行編譯后的目標文件。初始化完成后讀取腳本文件,引擎對腳本文件進行詞法分析,語法分析。 轉載 http://www.php-internals.com/book/?p=chapt02/02-03-00-how-php-script-g... 轉載 http://www.l...

    XiNGRZ 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<