亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > PHP > 正文

PHP框架設計之ThinkPHP5源碼解析一

2020-03-22 18:50:06
字體:
來源:轉載
供稿:網友
ThinkPHP是一個快速、兼容而且簡單的輕量級國產PHP開發框架,也是國內使用最為廣泛的國產框架。誕生于2006年,歷經FCS0.6.0到 ThinkPHP 0.9.5,歷經1.0到3.0的發展。2015年發布ThinkPHP5.0版本。采用全新的架構思想,引入了更多的PHP新特性,優化了核心,減少了依賴,實現了真正的惰性加載,支持composer,并針對API開發做了大量的優化,包括路由、日志、異常、模型、數據庫、模板引擎和驗證等模塊都已經重構。兼容PHP最新版本。這使得他成為框架的首選。下面也就其框架對一定的解析。

運行機制及流程

990.jpg

1.入口文件index.php

獨立模式

define('APP_PATH', __DIR__ . '/../application/');define('APP_DEBUG', true);require __DIR__ . '/../thinkphp/start.php';

composer模式

define('APP_PATH', __DIR__ . '/../application/');define('APP_DEBUG', true);if (is_file(__DIR__ . '/../vendor/autoload.php')) {    require_once __DIR__ . '/../vendor/autoload.php';} else {    require __DIR__ . '/../thinkphp/start.php';}

2.框架引導文件start.php

namespace think;// ThinkPHP 引導文件// 加載基礎文件require __DIR__ . '/base.php';// 執行應用App::run()->send();

3.html' target='_blank'>全局變量文件base.php

define('THINK_VERSION', '5.0.2'); //TP版本號define('THINK_START_TIME', microtime(true));//啟動時間define('THINK_START_MEM', memory_get_usage());//獲取分配給 PHP 的內存量define('EXT', '.php'); //文件后綴define('DS', DIRECTORY_SEPARATOR);//系統分隔符defined('THINK_PATH') or define('THINK_PATH', __DIR__ . DS);//項目根目錄define('LIB_PATH', THINK_PATH . 'library' . DS);//類庫目錄define('CORE_PATH', LIB_PATH . 'think' . DS);//核心文件目錄define('TRAIT_PATH', LIB_PATH . 'traits' . DS);//復用機制文件目錄defined('APP_PATH') or define('APP_PATH', dirname($_SERVER['SCRIPT_FILENAME']) . DS);//應用根目錄defined('ROOT_PATH') or define('ROOT_PATH', dirname(realpath(APP_PATH)) . DS);//根目錄defined('EXTEND_PATH') or define('EXTEND_PATH', ROOT_PATH . 'extend' . DS);//擴展目錄defined('VENDOR_PATH') or define('VENDOR_PATH', ROOT_PATH . 'vendor' . DS);//第三方庫和插件放置defined('RUNTIME_PATH') or define('RUNTIME_PATH', ROOT_PATH . 'runtime' . DS);//運行緩存目錄defined('LOG_PATH') or define('LOG_PATH', RUNTIME_PATH . 'log' . DS);//日志文件目錄defined('CACHE_PATH') or define('CACHE_PATH', RUNTIME_PATH . 'cache' . DS);//緩存文件目錄defined('TEMP_PATH') or define('TEMP_PATH', RUNTIME_PATH . 'temp' . DS);//臨時目錄defined('CONF_PATH') or define('CONF_PATH', APP_PATH); // 配置文件目錄defined('CONF_EXT') or define('CONF_EXT', EXT); // 配置文件后綴defined('ENV_PREFIX') or define('ENV_PREFIX', 'PHP_'); // 環境變量的配置前綴// 環境常量define('IS_CLI', PHP_SAPI == 'cli' ? true : false);define('IS_WIN', strpos(PHP_OS, 'WIN') !== false);// 載入Loader類require CORE_PATH . 'Loader.php';// 加載環境變量配置文件if (is_file(ROOT_PATH . '.env')) { $env = parse_ini_file(ROOT_PATH . '.env', true); foreach ($env as $key => $val) { $name = ENV_PREFIX . strtoupper($key); if (is_array($val)) { foreach ($val as $k => $v) { $item = $name . '_' . strtoupper($k); putenv("$item=$v"); } } else { putenv("$name=$val"); } }}// 注冊自動加載/think/Loader::register();// 注冊錯誤和異常處理機制/think/Error::register();// 加載慣例配置文件/think/Config::set(include THINK_PATH . 'convention' . EXT);

4.自動加載器文件Loader.php

Loader.php是框架的類的自動加載實現文件??梢允褂胊utoload()自動擋加載類,import()手動加載指定目錄的類。
protected static $map = []; 系統的類名映射緩存數組,在下面的addMap()使用
protected static $load = []; 系統的加載列表緩存數組,在下面的autoload()使用
protected static $namespace = []; 系統的命名空間緩存數組,在下面的addNamespace()使用

private static $prefixLengthsPsr4 = [];private static $prefixDirsPsr4    = [];

系統的PSR-4緩存數組,在下面的registerComposerLoader()使用
private static $prefixesPsr0 = []; 系統的PSR-0緩存數組,在下面的registerComposerLoader()使用。

上面四個靜態變量用作加載器的緩存數組,保證加載效率。

1 autoload($class)
根據類名自動加載。

public static function autoload($class){}

使用類庫映射加載對應的類。

if (isset(self::$map[$class])) {    if (is_file(self::$map[$class])) {        APP_DEBUG && self::$load[] = self::$map[$class];        include self::$map[$class];    }}

使用composer加載類

elseif ($file = self::findFileInComposer($class)) {    APP_DEBUG && self::$load[] = $file;    include $file;}

根據命名空間自動加載類

else {    if (!strpos($class, '//')) {        return;    }    list($name, $class) = explode('//', $class, 2);        if (isset(self::$namespace[$name])) {        $path = self::$namespace[$name];    } elseif (is_dir(EXTEND_PATH . $name)) {        $path = EXTEND_PATH . $name . DS;    } else {        return;    }    $filename = $path . str_replace('//', DS, $class) . EXT;        if (is_file($filename)) {        if (APP_DEBUG && IS_WIN && false === strpos(realpath($filename), $class . EXT)) {            return;        }        APP_DEBUG && self::$load[] = $filename;        include $filename;    } else {        Log::record('autoloader error : ' . $filename, 'notice');    }}

2 addMap($class,$map='')
注冊類名映射
public static function addMap($class, $map = ''){} 數組合并到$map,字符串關聯到$class.

if (is_array($class)) {    self::$map = array_merge(self::$map, $class);} else {    self::$map[$class] = $map;}

3 addNamespace($namespace,$path)
注冊命名空間和路徑的關聯
public static function addNamespace($namespace, $path = ''){} 數組合并到$namespace,字符串關聯到path.

if (is_array($namespace)) {    self::$namespace = array_merge(self::$namespace, $namespace);} else {    self::$namespace[$namespace] = $path;}

4 register($autoload='')
注冊自動加載機制
public static function register($autoload = ''){} think/Loader::autoload()系統自動加載
self::registerComposerLoader() composer自動加載

spl_autoload_register($autoload ? $autoload : 'think//Loader::autoload');self::registerComposerLoader();

5 composer自動加載的注冊
private static function registerComposerLoader(){} 關于composer自動加載機制見 基礎原理的php的composer自動加載

6 composer自動加載的兩個私有方法

private static function composerRequire($fileIdentifier, $file){}private static function findFileInComposer($class, $ext = '.php'){}

7 import($class,$baseUrl='',$ext=EXT)
手動加載$baseUrl下的$class命名的$ext后綴文件
public static function import($class, $baseUrl = '', $ext = EXT){} 首先分析$baseUrl,
然后查找$baserUrl.$class.$ext 文件名,然后加載對應文件

以上就是PHP框架設計之ThinkPHP5源碼解析一的內容,更多相關內容請關注PHP (www.49028c.com)!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
97在线精品国自产拍中文| 国产综合视频在线观看| 66m—66摸成人免费视频| 亚洲一区二区三区777| 欧美日韩性视频| 欧美午夜精品在线| 欧美一级淫片丝袜脚交| 精品国产一区二区在线| 国产美女久久精品香蕉69| 亚洲va国产va天堂va久久| 国产精品偷伦视频免费观看国产| 亚洲综合在线小说| 第一福利永久视频精品| 亚洲第一av在线| 亚洲精品丝袜日韩| 亚洲国产欧美一区二区三区同亚洲| 久久久久久91香蕉国产| 亚洲视频专区在线| 国产亚洲精品va在线观看| 最近更新的2019中文字幕| 亚洲福利影片在线| 久久香蕉精品香蕉| 国产成人精品综合久久久| 国产日韩一区在线| 久久精品一区中文字幕| 97视频在线观看播放| 日韩经典第一页| 久久91精品国产| 国产成人午夜视频网址| 一区二区欧美久久| 成人黄色短视频在线观看| 午夜精品久久久久久久久久久久久| 国产精品小说在线| 久久久97精品| 一区二区欧美久久| 亚洲精品久久久一区二区三区| 精品国产乱码久久久久久婷婷| 亚洲精品久久久久中文字幕二区| 久久伊人91精品综合网站| 亚洲视频在线视频| 久久久精品免费视频| 久久好看免费视频| 久久久久久久国产精品视频| 精品视频—区二区三区免费| 色阁综合伊人av| 亚洲欧美成人一区二区在线电影| 欧美精品性视频| 日韩av黄色在线观看| 在线观看91久久久久久| 91av在线国产| 综合av色偷偷网| 国产精品专区h在线观看| 日韩精品在线免费观看视频| 精品调教chinesegay| 亚洲电影中文字幕| 国产精品女视频| 第一福利永久视频精品| 久久欧美在线电影| 91精品在线一区| 精品国产乱码久久久久久婷婷| 亚洲精品美女网站| 欧美高清视频免费观看| 性金发美女69hd大尺寸| 91手机视频在线观看| 91久久精品久久国产性色也91| 久久91亚洲精品中文字幕奶水| 91麻豆桃色免费看| 91免费观看网站| 日韩精品有码在线观看| 色偷偷偷亚洲综合网另类| 中文字幕久热精品视频在线| 亚洲国产欧美在线成人app| 欧美成人精品在线视频| 欧美成人午夜激情在线| 91久久精品久久国产性色也91| 国产香蕉一区二区三区在线视频| 日韩av网站导航| 清纯唯美亚洲激情| 中国人与牲禽动交精品| 精品少妇一区二区30p| 深夜福利日韩在线看| 91网站免费观看| 日韩激情av在线免费观看| 国产精品女人久久久久久| 亚洲免费高清视频| 亚洲性线免费观看视频成熟| 成人xxxx视频| 亚洲国产精品人久久电影| 亚洲美女精品成人在线视频| 日韩精品免费在线观看| 亚洲视频在线观看网站| 欧美小视频在线观看| 国产91色在线| 国产欧美久久一区二区| 爱福利视频一区| 国产在线视频一区| 亚洲欧美日韩中文在线制服| 国产精品成久久久久三级| 国产亚洲精品久久| 久久躁日日躁aaaaxxxx| 欧美精品日韩三级| 亚洲欧美精品一区二区| 亚洲wwwav| 国产精品久久久久久久久久久久久久| 日本精品免费一区二区三区| 亚洲精品久久久久国产| 中文字幕亚洲一区二区三区五十路| 亚洲毛片一区二区| 欧美在线视频免费观看| 国产精品扒开腿爽爽爽视频| 日韩中文字幕精品视频| 亚洲天堂av在线免费观看| 欧美日韩国产综合视频在线观看中文| 91在线视频成人| 狠狠色狠色综合曰曰| 欧美亚洲免费电影| 欧美在线一级视频| 97精品视频在线观看| 欧美日韩国产精品一区二区三区四区| 欧美激情性做爰免费视频| 亚洲成人亚洲激情| 北条麻妃一区二区在线观看| 国产成人中文字幕| 日本免费在线精品| 欧美国产日韩一区| 亚洲最大av网站| 国产精品久久久久高潮| 欧美黄网免费在线观看| 一区二区三区无码高清视频| 日韩女优人人人人射在线视频| 亚洲欧美中文日韩v在线观看| 久久久久亚洲精品成人网小说| 茄子视频成人在线| 亚洲国产99精品国自产| 日本最新高清不卡中文字幕| 欧美激情一区二区久久久| 国产999精品| 国产精品久久电影观看| 成人黄色在线观看| 91九色国产社区在线观看| 日韩男女性生活视频| 亚洲激情免费观看| 久久免费视频在线观看| 精品性高朝久久久久久久| 久久精品视频网站| 一区二区三区四区视频| 国产亚洲精品久久久| 欧美日韩国产在线| 中文字幕欧美日韩va免费视频| 在线看日韩欧美| 日韩精品久久久久久久玫瑰园| 亚洲淫片在线视频| 国产欧美精品va在线观看| 国产精品扒开腿爽爽爽视频| 中文字幕久久久| 国产精品男人爽免费视频1| 久久国产精品影视| 国产精品视频一区二区三区四| 在线视频国产日韩| 国产欧美韩国高清| 欧美性极品xxxx娇小| 国产成人亚洲综合青青| 午夜伦理精品一区| 色偷偷综合社区|