摘要:先來(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
摘要:是一個(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...
摘要:當(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ā)...
摘要:當(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ī)則匹配),如下:
摘要:開發(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...
摘要:每一個(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)目之前選...
閱讀 2576·2023-04-25 19:47
閱讀 3418·2019-08-29 17:18
閱讀 875·2019-08-29 15:26
閱讀 3385·2019-08-29 14:17
閱讀 1197·2019-08-26 13:49
閱讀 3362·2019-08-26 13:22
閱讀 3051·2019-08-26 10:44
閱讀 2722·2019-08-23 16:51