亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

php微框架 flight源碼閱讀——1.自動加載

OnlyLing / 2129人閱讀

摘要:先來看下框架的單入口文件,先引入了框架類文件。中定義了加載存放哪些類型類路徑數(shù)組對象數(shù)組框架目錄路徑數(shù)組中使用將當(dāng)前類中的方法注冊為加載的執(zhí)行方法。接下來我們試著按照自動加載的方式,寫個(gè)簡單的自動加載進(jìn)行測試微框架源碼閱讀系列

先來看下框架的單入口文件index.php,先引入了Flight.php框架類文件。


Flight.php中定義了Flight類,類里面先定義了3個(gè)魔術(shù)方法,這三個(gè)魔術(shù)方法是為了防止當(dāng)前類被實(shí)例化

// Don"t allow object instantiation
private function __construct() {}
private function __destruct() {}
private function __clone() {}

如果試著去new Flight會提示如下錯誤:

Fatal error: Uncaught Error: Call to private Flight::__construct() from invalid context in /usr/local/var/www/flight135/index.php:3 Stack trace: #0 {main} Next Error: Call to private Flight::__destruct() from context "" in /usr/local/var/www/flight135/index.php:3 Stack trace: #0 {main} thrown in /usr/local/var/www/flight135/index.php on line 3

接著定義了一個(gè)重載方法__callStatic(),在index.php中執(zhí)行Flight::route("/", "hello")就會調(diào)用該__callStatic,其中$name就是"route",$params就是自己寫的hello函數(shù)。在__callStatic()中調(diào)用了當(dāng)前類的app()靜態(tài)方法,這里為什么不使用self::app()來調(diào)用呢?

/**
 * Handles calls to static methods.
 *
 * @param string $name Method name
 * @param array $params Method parameters
 * @return mixed Callback results
 * @throws Exception
 */
public static function __callStatic($name, $params) {
    $app = Flight::app();
    return flightcoreDispatcher::invokeMethod(array($app, $name), $params);
}

接著就是在static app()中開始處理自動加載了

/**
 * @return flightEngine Application instance
 */
public static function app() {
    static $initialized = false;
    if (!$initialized) {
        require_once __DIR__."/autoload.php";
        self::$engine = new flightEngine();
        $initialized = true;
    }
    return self::$engine;
}

進(jìn)入到autoload.php來看,引入了core目錄下的Loader.php類文件,Loader就是加載器。

autoload.php
require_once __DIR__."/core/Loader.php";
flightcoreLoader::autoload(true, dirname(__DIR__));

Loader中定義了加載存放哪些類型:$classes(類路徑數(shù)組),$instances(對象數(shù)組),$dirs(框架目錄路徑數(shù)組)

/**
 * Registered classes.
 *
 * @var array
 */
protected $classes = array();
/**
 * Class instances.
 *
 * @var array
 */
protected $instances = array();
/**
 * Autoload directories.
 *
 * @var array
 */
protected static $dirs = array();

autoload()中使用spl_autoload_register將當(dāng)前類(__CLASS__)中的loadClass方法注冊為加載的執(zhí)行方法。

/**
 * Starts/stops autoloader.
 *
 * @param bool $enabled Enable/disable autoloading
 * @param array $dirs Autoload directories
 */
public static function autoload($enabled = true, $dirs = array()) {
    if ($enabled) {
        spl_autoload_register(array(__CLASS__, "loadClass"));
    }
    else {
        spl_autoload_unregister(array(__CLASS__, "loadClass"));
    }
    if (!empty($dirs)) {
        self::addDirectory($dirs);
    }
}

/**
 * Autoloads classes.
 *
 * @param string $class Class name
 */
public static function loadClass($class) {
    $class_file = str_replace(array("", "_"), "/", $class).".php";
    foreach (self::$dirs as $dir) {
        $file = $dir."/".$class_file;
        if (file_exists($file)) {
            require $file;
            return;
        }
    }
}

接下來我們試著按照flight自動加載的方式,寫個(gè)簡單的自動加載進(jìn)行測試:


/autoload/index.php

 string(36) "/usr/local/var/www/autoload/Test.php" [1]=> string(37) "/usr/local/var/www/autoload/Test2.php" } 

/autoload/Loader.php



/autoload/Test.php



/autoload/Test2.php



php微框架 flight源碼閱讀系列

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/29081.html

相關(guān)文章

  • php框架 flight源碼閱讀

    摘要:是一個(gè)可擴(kuò)展的微框架,快速簡單,能夠快速輕松地構(gòu)建應(yīng)用程序,在上有??蚣艽a十分精簡,在幾分鐘內(nèi)你就可以看完整個(gè)框架源碼,使用起來也是很簡單優(yōu)雅。目錄微框架源碼閱讀自動加載微框架源碼閱讀框架初始化微框架源碼閱讀路由實(shí)現(xiàn)及執(zhí)行過程 Flight https://github.com/mikecao/fl...是一個(gè)可擴(kuò)展的PHP微框架,快速、簡單,能夠快速輕松地構(gòu)建RESTful web...

    CntChen 評論0 收藏0
  • php框架 flight源碼閱讀——2.框架初始化、Loader、Dispatcher

    摘要:當(dāng)調(diào)用時(shí),會觸發(fā)當(dāng)前類的魔術(shù)方法,通過判斷屬性中索引是否存在,不存在拋出異常,存在就通過去實(shí)例化初始化時(shí)設(shè)置的,這里是工廠模式,接下來的路由文章會詳細(xì)分析。在操作中,會將前置操作設(shè)置到類的屬性中。微框架源碼閱讀系列 在自動加載實(shí)現(xiàn)完成后,接著new flightEngine()自動加載的方式實(shí)例化了下框架的核心類Engine,這個(gè)類名翻譯過來就是引擎發(fā)動機(jī)的意思,是flight的引擎發(fā)...

    U2FsdGVkX1x 評論0 收藏0
  • php框架 flight源碼閱讀——3.路由Router實(shí)現(xiàn)及執(zhí)行過程

    摘要:當(dāng)然在對象中也沒有方法,于是會觸發(fā)當(dāng)前對象中的魔術(shù)方法。獲取對象獲取對象獲取對象設(shè)置方法執(zhí)行的后置操作現(xiàn)在來看操作都做了什么。匹配的部分對路由匹配實(shí)現(xiàn)正則匹配微框架源碼閱讀系列 現(xiàn)在來分析路由實(shí)現(xiàn)及執(zhí)行過程,在項(xiàng)目目錄下創(chuàng)建index.php,使用文檔中的路由例子(含有路由規(guī)則匹配),如下:

    王晗 評論0 收藏0
  • laravel入門

    摘要:開發(fā)根目錄測試分為單元測試和功能測試創(chuàng)建一個(gè)文件執(zhí)行測試測試前清除配置緩存運(yùn)行單個(gè)測試用例小提示在開發(fā)與進(jìn)行交互的第三方擴(kuò)展包時(shí),最好選擇注入契約而不使用。 參考https://laravelacademy.org/ 概念 單詞 契約Contract 就是接口 repository 倉庫(封裝數(shù)據(jù)訪問,可以搜索:repository模式) Container 容器 ServicePr...

    韓冰 評論0 收藏0
  • 你不可不知道的20個(gè)優(yōu)秀PHP框架

    摘要:每一個(gè)開發(fā)者都知道,擁有一個(gè)強(qiáng)大的框架可以讓開發(fā)工作變得更加快捷安全和有效。官方網(wǎng)站是一款老牌的框架,現(xiàn)在穩(wěn)定版本已經(jīng)是了。官方網(wǎng)站是由最大的社區(qū)之一的管理開發(fā)的,也是一個(gè)開源的框架。 對于Web開發(fā)者來說,PHP是一款非常強(qiáng)大而又受歡迎的編程語言。世界上很多頂級的網(wǎng)站都是基于PHP開發(fā)的。 每一個(gè)開發(fā)者都知道,擁有一個(gè)強(qiáng)大的框架可以讓開發(fā)工作變得更加快捷、安全和有效。在開發(fā)項(xiàng)目之前選...

    zombieda 評論0 收藏0

發(fā)表評論

0條評論

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