摘要:先來看下框架的單入口文件,先引入了框架類文件。中定義了加載存放哪些類型類路徑數組對象數組框架目錄路徑數組中使用將當前類中的方法注冊為加載的執行方法。接下來我們試著按照自動加載的方式,寫個簡單的自動加載進行測試微框架源碼閱讀系列
先來看下框架的單入口文件index.php,先引入了Flight.php框架類文件。
Flight.php中定義了Flight類,類里面先定義了3個魔術方法,這三個魔術方法是為了防止當前類被實例化
// 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接著定義了一個重載方法__callStatic(),在index.php中執行Flight::route("/", "hello")就會調用該__callStatic,其中$name就是"route",$params就是自己寫的hello函數。在__callStatic()中調用了當前類的app()靜態方法,這里為什么不使用self::app()來調用呢?
/** * 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; }進入到autoload.php來看,引入了core目錄下的Loader.php類文件,Loader就是加載器。
autoload.php require_once __DIR__."/core/Loader.php"; flightcoreLoader::autoload(true, dirname(__DIR__));Loader中定義了加載存放哪些類型:$classes(類路徑數組),$instances(對象數組),$dirs(框架目錄路徑數組)
/** * 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將當前類(__CLASS__)中的loadClass方法注冊為加載的執行方法。
/** * 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自動加載的方式,寫個簡單的自動加載進行測試:
/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源碼閱讀系列
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/29081.html
摘要:是一個可擴展的微框架,快速簡單,能夠快速輕松地構建應用程序,在上有。框架代碼十分精簡,在幾分鐘內你就可以看完整個框架源碼,使用起來也是很簡單優雅。目錄微框架源碼閱讀自動加載微框架源碼閱讀框架初始化微框架源碼閱讀路由實現及執行過程 Flight https://github.com/mikecao/fl...是一個可擴展的PHP微框架,快速、簡單,能夠快速輕松地構建RESTful web...
摘要:當調用時,會觸發當前類的魔術方法,通過判斷屬性中索引是否存在,不存在拋出異常,存在就通過去實例化初始化時設置的,這里是工廠模式,接下來的路由文章會詳細分析。在操作中,會將前置操作設置到類的屬性中。微框架源碼閱讀系列 在自動加載實現完成后,接著new flightEngine()自動加載的方式實例化了下框架的核心類Engine,這個類名翻譯過來就是引擎發動機的意思,是flight的引擎發...
摘要:當然在對象中也沒有方法,于是會觸發當前對象中的魔術方法。獲取對象獲取對象獲取對象設置方法執行的后置操作現在來看操作都做了什么。匹配的部分對路由匹配實現正則匹配微框架源碼閱讀系列 現在來分析路由實現及執行過程,在項目目錄下創建index.php,使用文檔中的路由例子(含有路由規則匹配),如下:
摘要:每一個開發者都知道,擁有一個強大的框架可以讓開發工作變得更加快捷安全和有效。官方網站是一款老牌的框架,現在穩定版本已經是了。官方網站是由最大的社區之一的管理開發的,也是一個開源的框架。 對于Web開發者來說,PHP是一款非常強大而又受歡迎的編程語言。世界上很多頂級的網站都是基于PHP開發的。 每一個開發者都知道,擁有一個強大的框架可以讓開發工作變得更加快捷、安全和有效。在開發項目之前選...
閱讀 2536·2023-04-25 19:47
閱讀 3383·2019-08-29 17:18
閱讀 856·2019-08-29 15:26
閱讀 3360·2019-08-29 14:17
閱讀 1116·2019-08-26 13:49
閱讀 3339·2019-08-26 13:22
閱讀 3023·2019-08-26 10:44
閱讀 2693·2019-08-23 16:51