成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專(zhuān)欄INFORMATION COLUMN

php微框架 flight源碼閱讀——2.框架初始化、Loader、Dispatcher

U2FsdGVkX1x / 2368人閱讀

摘要:當(dāng)調(diào)用時(shí),會(huì)觸發(fā)當(dāng)前類(lèi)的魔術(shù)方法,通過(guò)判斷屬性中索引是否存在,不存在拋出異常,存在就通過(guò)去實(shí)例化初始化時(shí)設(shè)置的,這里是工廠(chǎng)模式,接下來(lái)的路由文章會(huì)詳細(xì)分析。在操作中,會(huì)將前置操作設(shè)置到類(lèi)的屬性中。微框架源碼閱讀系列

在自動(dòng)加載實(shí)現(xiàn)完成后,接著new flightEngine()自動(dòng)加載的方式實(shí)例化了下框架的核心類(lèi)Engine,這個(gè)類(lèi)名翻譯過(guò)來(lái)就是引擎發(fā)動(dòng)機(jī)的意思,是flight的引擎發(fā)動(dòng)機(jī),很有想象力吧。

public static function app() {
    static $initialized = false;

    if (!$initialized) {
        require_once __DIR__."/autoload.php";

        self::$engine = new flightEngine();

        $initialized = true;
    }

    return self::$engine;
}

在實(shí)例化Engine這個(gè)類(lèi)的時(shí)候,當(dāng)前類(lèi)的構(gòu)造方法進(jìn)行了對(duì)框架的初始化工作。

public function __construct() {
    $this->vars = array();

    $this->loader = new Loader();
    $this->dispatcher = new Dispatcher();

    $this->init();
}

接著來(lái)看init方法都做了什么,將初始化狀態(tài)標(biāo)記為靜態(tài)變量static $initialized,判斷如果為true,將$this->vars以及$this->loader、$this->dispatcher中保存的屬性重置為默認(rèn)狀態(tài)。

static $initialized = false;
$self = $this;

if ($initialized) {
    $this->vars = array();
    $this->loader->reset();
    $this->dispatcher->reset();
}

接下來(lái)將框架的Request、Response、Router、View類(lèi)的命定空間地址register(設(shè)置)到Loader類(lèi)的classes屬性中。

// Register default components
$this->loader->register("request", "flight
etRequest");
$this->loader->register("response", "flight
etResponse");
$this->loader->register("router", "flight
etRouter");
$this->loader->register("view", "flight	emplateView", array(), function($view) use ($self) {
    $view->path = $self->get("flight.views.path");
    $view->extension = $self->get("flight.views.extension");
});  

flight/core/Loader.php

public function register($name, $class, array $params = array(), $callback = null) {
    unset($this->instances[$name]);

    $this->classes[$name] = array($class, $params, $callback);
}

再接下來(lái)就是將框架給用戶(hù)提供的調(diào)用方法,設(shè)置到調(diào)度器Dispatcher類(lèi)的events屬性中。

// Register framework methods
$methods = array(
    "start","stop","route","halt","error","notFound",
    "render","redirect","etag","lastModified","json","jsonp"
);
foreach ($methods as $name) {
    $this->dispatcher->set($name, array($this, "_".$name));
}

flight/core/Dispatcher.php

/**
 * Assigns a callback to an event.
 *
 * @param string $name Event name
 * @param callback $callback Callback function
 */
public function set($name, $callback) {
    $this->events[$name] = $callback;
}

接下來(lái)呢,就是設(shè)置框架的一些配置,將這些配置保存在Engine類(lèi)的vars屬性中。

// Default configuration settings
$this->set("flight.base_url", null);
$this->set("flight.case_sensitive", false);
$this->set("flight.handle_errors", true);
$this->set("flight.log_errors", false);
$this->set("flight.views.path", "./views");
$this->set("flight.views.extension", ".php");

flight/Engine.php

/**
 * Sets a variable.
 *
 * @param mixed $key Key
 * @param string $value Value
 */
public function set($key, $value = null) {
    if (is_array($key) || is_object($key)) {
        foreach ($key as $k => $v) {
            $this->vars[$k] = $v;
        }
    }
    else {
        $this->vars[$key] = $value;
    }
}

最后一步的操作,當(dāng)調(diào)用框架的start方法時(shí),給其設(shè)置一些前置操作,通過(guò)set_error_handler()和set_exception_handler()設(shè)置用戶(hù)自定義的錯(cuò)誤和異常處理函數(shù),如何使用自定義的錯(cuò)誤和異常函數(shù),可以看這兩個(gè)范例:https://segmentfault.com/n/13...
https://segmentfault.com/n/13...。

// Startup configuration
$this->before("start", function() use ($self) {
    // Enable error handling
    if ($self->get("flight.handle_errors")) {
        set_error_handler(array($self, "handleError"));
        set_exception_handler(array($self, "handleException"));
    }

    // Set case-sensitivity
    $self->router()->case_sensitive = $self->get("flight.case_sensitive");
});

$initialized = true;

/**
 * Custom error handler. Converts errors into exceptions.
 *
 * @param int $errno Error number
 * @param int $errstr Error string
 * @param int $errfile Error file name
 * @param int $errline Error file line number
 * @throws ErrorException
 */
public function handleError($errno, $errstr, $errfile, $errline) {
    if ($errno & error_reporting()) {
        throw new ErrorException($errstr, $errno, 0, $errfile, $errline);
    }
}

/**
 * Custom exception handler. Logs exceptions.
 *
 * @param Exception $e Thrown exception
 */
public function handleException($e) {
    if ($this->get("flight.log_errors")) {
        error_log($e->getMessage());
    }

    $this->error($e);
}

當(dāng)調(diào)用$self->router()時(shí),會(huì)觸發(fā)當(dāng)前類(lèi)的__call()魔術(shù)方法,通過(guò)$this->loader->get($name)判斷屬性$classes中router索引是否存在,不存在拋出異常,存在就通過(guò)$this->loader->load($name, $shared)去實(shí)例化初始化時(shí)設(shè)置的"flight etRouter",這里是工廠(chǎng)模式,接下來(lái)的路由文章會(huì)詳細(xì)分析。

/**
 * Handles calls to class methods.
 *
 * @param string $name Method name
 * @param array $params Method parameters
 * @return mixed Callback results
 * @throws Exception
 */
public function __call($name, $params) {
    $callback = $this->dispatcher->get($name);
 
    if (is_callable($callback)) {
        return $this->dispatcher->run($name, $params);
    }

    if (!$this->loader->get($name)) {
        throw new Exception("{$name} must be a mapped method.");
    }

    $shared = (!empty($params)) ? (bool)$params[0] : true;

    return $this->loader->load($name, $shared);
}

$this->before()操作中,會(huì)將前置操作設(shè)置到Dispatcher類(lèi)的filters屬性中。這些操作完成后,將$initialized = true。

/**
 * Adds a pre-filter to a method.
 *
 * @param string $name Method name
 * @param callback $callback Callback function
 */
public function before($name, $callback) {
    $this->dispatcher->hook($name, "before", $callback);
}

flight/core/Dispatcher.php

/**
 * Hooks a callback to an event.
 *
 * @param string $name Event name
 * @param string $type Filter type
 * @param callback $callback Callback function
 */
public function hook($name, $type, $callback) {
    $this->filters[$name][$type][] = $callback;
}


php微框架 flight源碼閱讀系列

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/29752.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源碼閱讀——1.自動(dòng)加載

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

    OnlyLing 評(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
  • 你不可不知道的20個(gè)優(yōu)秀PHP框架

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

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

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

0條評(píng)論

閱讀需要支付1元查看
<