成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

php微框架 flight源碼閱讀——1.自動(dòng)加載

OnlyLing / 2103人閱讀

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

先來(lái)看下框架的單入口文件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會(huì)提示如下錯(cuò)誤:

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")就會(huì)調(diào)用該__callStatic,其中$name就是"route",$params就是自己寫的hello函數(shù)。在__callStatic()中調(diào)用了當(dāng)前類的app()靜態(tài)方法,這里為什么不使用self::app()來(lái)調(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()中開始處理自動(dòng)加載了

/**
 * @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來(lái)看,引入了core目錄下的Loader.php類文件,Loader就是加載器。

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

Loader中定義了加載存放哪些類型:$classes(類路徑數(shù)組),$instances(對(duì)象數(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方法注冊(cè)為加載的執(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;
        }
    }
}

接下來(lái)我們?cè)囍凑說(shuō)light自動(dòng)加載的方式,寫個(gè)簡(jiǎn)單的自動(dòng)加載進(jìn)行測(cè)試:


/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)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/29081.html

相關(guān)文章

  • php框架 flight源碼閱讀

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

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

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

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

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

    王晗 評(píng)論0 收藏0
  • laravel入門

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

    韓冰 評(píng)論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è)開源的框架。 對(duì)于Web開發(fā)者來(lái)說(shuō),PHP是一款非常強(qiáng)大而又受歡迎的編程語(yǔ)言。世界上很多頂級(jí)的網(wǎng)站都是基于PHP開發(fā)的。 每一個(gè)開發(fā)者都知道,擁有一個(gè)強(qiáng)大的框架可以讓開發(fā)工作變得更加快捷、安全和有效。在開發(fā)項(xiàng)目之前選...

    zombieda 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<