摘要:當調用時,會觸發當前類的魔術方法,通過判斷屬性中索引是否存在,不存在拋出異常,存在就通過去實例化初始化時設置的,這里是工廠模式,接下來的路由文章會詳細分析。在操作中,會將前置操作設置到類的屬性中。微框架源碼閱讀系列
在自動加載實現完成后,接著new flightEngine()自動加載的方式實例化了下框架的核心類Engine,這個類名翻譯過來就是引擎發動機的意思,是flight的引擎發動機,很有想象力吧。
public static function app() { static $initialized = false; if (!$initialized) { require_once __DIR__."/autoload.php"; self::$engine = new flightEngine(); $initialized = true; } return self::$engine; }
在實例化Engine這個類的時候,當前類的構造方法進行了對框架的初始化工作。
public function __construct() { $this->vars = array(); $this->loader = new Loader(); $this->dispatcher = new Dispatcher(); $this->init(); }
接著來看init方法都做了什么,將初始化狀態標記為靜態變量static $initialized,判斷如果為true,將$this->vars以及$this->loader、$this->dispatcher中保存的屬性重置為默認狀態。
static $initialized = false; $self = $this; if ($initialized) { $this->vars = array(); $this->loader->reset(); $this->dispatcher->reset(); }
接下來將框架的Request、Response、Router、View類的命定空間地址register(設置)到Loader類的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); }
再接下來就是將框架給用戶提供的調用方法,設置到調度器Dispatcher類的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; }
接下來呢,就是設置框架的一些配置,將這些配置保存在Engine類的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; } }
最后一步的操作,當調用框架的start方法時,給其設置一些前置操作,通過set_error_handler()和set_exception_handler()設置用戶自定義的錯誤和異常處理函數,如何使用自定義的錯誤和異常函數,可以看這兩個范例: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); }
當調用$self->router()時,會觸發當前類的__call()魔術方法,通過$this->loader->get($name)判斷屬性$classes中router索引是否存在,不存在拋出異常,存在就通過$this->loader->load($name, $shared)去實例化初始化時設置的"flight etRouter",這里是工廠模式,接下來的路由文章會詳細分析。
/** * 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()操作中,會將前置操作設置到Dispatcher類的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源碼閱讀系列
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/29752.html
摘要:是一個可擴展的微框架,快速簡單,能夠快速輕松地構建應用程序,在上有。框架代碼十分精簡,在幾分鐘內你就可以看完整個框架源碼,使用起來也是很簡單優雅。目錄微框架源碼閱讀自動加載微框架源碼閱讀框架初始化微框架源碼閱讀路由實現及執行過程 Flight https://github.com/mikecao/fl...是一個可擴展的PHP微框架,快速、簡單,能夠快速輕松地構建RESTful web...
摘要:先來看下框架的單入口文件,先引入了框架類文件。中定義了加載存放哪些類型類路徑數組對象數組框架目錄路徑數組中使用將當前類中的方法注冊為加載的執行方法。接下來我們試著按照自動加載的方式,寫個簡單的自動加載進行測試微框架源碼閱讀系列 先來看下框架的單入口文件index.php,先引入了Flight.php框架類文件。
摘要:當然在對象中也沒有方法,于是會觸發當前對象中的魔術方法。獲取對象獲取對象獲取對象設置方法執行的后置操作現在來看操作都做了什么。匹配的部分對路由匹配實現正則匹配微框架源碼閱讀系列 現在來分析路由實現及執行過程,在項目目錄下創建index.php,使用文檔中的路由例子(含有路由規則匹配),如下:
摘要:每一個開發者都知道,擁有一個強大的框架可以讓開發工作變得更加快捷安全和有效。官方網站是一款老牌的框架,現在穩定版本已經是了。官方網站是由最大的社區之一的管理開發的,也是一個開源的框架。 對于Web開發者來說,PHP是一款非常強大而又受歡迎的編程語言。世界上很多頂級的網站都是基于PHP開發的。 每一個開發者都知道,擁有一個強大的框架可以讓開發工作變得更加快捷、安全和有效。在開發項目之前選...
閱讀 3315·2021-11-12 10:36
閱讀 2467·2021-11-02 14:43
閱讀 2146·2019-08-30 14:23
閱讀 3463·2019-08-30 13:08
閱讀 919·2019-08-28 18:09
閱讀 3129·2019-08-26 12:22
閱讀 3141·2019-08-23 18:24
閱讀 2017·2019-08-23 18:17