文章目录

  • 回顾
  • 分析
回顾
  • 上一节我们分析了 执行应用的图解,也就是Container::get(‘app’)->run() 这一部分,这一节我们要分析的是thinkphp\library\think\App.php 中的 initialize 方法
分析
  • 上源码 其实源码上很多地方我都有注解
 public function initialize(){if ($this->initialized) { //初始化return;}$this->initialized = true;$this->beginTime   = microtime(true);$this->beginMem    = memory_get_usage();$this->rootPath    = dirname($this->appPath) . DIRECTORY_SEPARATOR;$this->runtimePath = $this->rootPath . 'runtime' . DIRECTORY_SEPARATOR;$this->routePath   = $this->rootPath . 'route' . DIRECTORY_SEPARATOR;$this->configPath  = $this->rootPath . 'config' . DIRECTORY_SEPARATOR;static::setInstance($this);//当前对象单例化$this->instance('app', $this);//当前对象放入容器// 加载环境变量配置文件if (is_file($this->rootPath . '.env')) {$this->env->load($this->rootPath . '.env');//Container ----> __get()--->Env.php ---->load()}$this->configExt = $this->env->get('config_ext', '.php');//加载惯例配置文件$this->config->set(include $this->thinkPath . 'convention.php');// 设置路径环境变量$this->env->set(['think_path'   => $this->thinkPath,'root_path'    => $this->rootPath,'app_path'     => $this->appPath,'config_path'  => $this->configPath,'route_path'   => $this->routePath,'runtime_path' => $this->runtimePath,'extend_path'  => $this->rootPath . 'extend' . DIRECTORY_SEPARATOR,'vendor_path'  => $this->rootPath . 'vendor' . DIRECTORY_SEPARATOR,]);$this->namespace = $this->env->get('app_namespace', $this->namespace);$this->env->set('app_namespace', $this->namespace);// 注册应用命名空间Loader::addNamespace($this->namespace, $this->appPath);  //app => D:\www\ThinkPHP_V5.1.39\application\// 初始化应用$this->init();// 开启类名后缀$this->suffix = $this->config('app.class_suffix');// 应用调试模式$this->appDebug = $this->env->get('app_debug', $this->config('app.app_debug'));$this->env->set('app_debug', $this->appDebug);if (!$this->appDebug) {ini_set('display_errors', 'Off');} elseif (PHP_SAPI != 'cli') {//重新申请一块比较大的bufferif (ob_get_level() > 0) {$output = ob_get_clean();}ob_start();if (!empty($output)) {echo $output;}}// 注册异常处理类if ($this->config('app.exception_handle')) {Error::setExceptionHandler($this->config('app.exception_handle'));}// 注册根命名空间if (!empty($this->config('app.root_namespace'))) {Loader::addNamespace($this->config('app.root_namespace'));}// 加载composer autofile文件Loader::loadComposerAutoloadFiles();// 注册类库别名 配置文件中的 也可以把别名写在配置文件中Loader::addClassAlias($this->config->pull('alias'));// 数据库配置初始化Db::init($this->config->pull('database'));// 设置系统时区date_default_timezone_set($this->config('app.default_timezone'));// 读取语言包$this->loadLangPack();// 路由初始化$this->routeInit();}
  • 加载环境变量配置文件
 $this->env->load($this->rootPath . '.env');//Container ----> __get()--->Env.php ---->load()

这个过程我稍微分析一下 App这个类继承Container ,当调用env 的时候就会去Container里面找,但是Container 里面也没有这个方法,那么就会调用__get()魔术方法 这个魔术方法就会去调用 make方法 然后就会返回Env.php实例最后调用load()

  • 加载惯例配置文件
$this->config->set(include $this->thinkPath . 'convention.php');

tp5里面的配置文件 分为了:惯例配置->应用配置->模块配置->动态配置
惯例配置:核心框架内置的配置文件,无需更改。
应用配置:每个应用的全局配置文件(框架安装后会生成初始的应用配置文件),有部分配置参数仅能在应用配置文件中设置。
模块配置:每个模块的配置文件(相同的配置参数会覆盖应用配置),有部分配置参数模块配置是无效的,因为已经使用过。
动态配置:主要是指在控制器或者行为中进行(动态)更改配置,该配置方式只在当次请求有效,因为不会保存到配置文件中。

注意:其他配置将会在$this->init()里面详细介绍下一节干吧!!!

  • 开启类名后缀
$this->suffix = $this->config('app.class_suffix');

应用配置文件app.php中设置:
‘class_suffix’ => true,// 开启应用类库后缀
app\index\model\User类定义就要改成
<?php
namespace app\index\model;
use think\Model;
class UserModel extends Model
{
}
并且文件名也要改为UserModel.php。

  • 注册类库别名 配置文件中的 也可以把别名写在配置文件中
Loader::addClassAlias($this->config->pull('alias'));

类似这样
[‘alias’=>
[ ‘App’ => facade\App::class,
‘Build’ => facade\Build::class,
‘Cache’ => facade\Cache::class,
‘Config’ => facade\Config::class,
‘Cookie’ => facade\Cookie::class,
] ]

  • 路由初始化【下次重点介绍对象】
  $this->routeInit();

TP5源码分析-执行应用【initialize方法分析】相关推荐

  1. mybatis源码之执行insert代码分析

    系列文档: mybatis源码之创建SqlSessionFactory代码分析 mybatis源码之创建SqlSessionFactory代码分析 - mapper xml解析 mybatis源码之执 ...

  2. spring源码依赖注入的核心方法populateBean(beanName, mbd, instanceWrapper)分析

    spring源码依赖注入的核心方法populateBean(beanName, mbd, instanceWrapper)分析:通过源码我们发现在分析这个方法之前,此对象已经创建完成实例,内存开辟了空 ...

  3. 源码|批量执行invokeAll()多选一invokeAny()

    ExecutorService中定义了两个批量执行任务的方法,invokeAll()和invokeAny(),在批量执行或多选一的业务场景中非常方便.invokeAll()在所有任务都完成(包括成功/ ...

  4. 分析开源项目源码,我们该如何入手分析?(授人以渔)

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:牛人 20000 字的 Spring Cloud 总结,太硬核了~ 1 前言 本文接上篇文章跟大家聊聊我们为什么 ...

  5. php5.5n的redis,TP5源码 Redis操作便捷类库

    # TP5源码 Redis操作便捷类库 > app\base\controller\Redis ~~~ /** * Created by PhpStorm. * Power by Mikkle ...

  6. jQuery方法源码解析--jQuery($)方法(一)

    jQuery方法源码解析--jQuery($)方法 注: 1.本文分析的代码为jQuery.1.11.1版本,在官网上下载未压缩版即可 2.转载请注明出处 jQuery方法: 这个方法大家都不陌生,在 ...

  7. 编译Android7.1源码出现OOM错误解决方法

    一:编译Android7.1源码出现OOM错误解决方法 在Android7.1编译过程中出现如下错误: Starting build with ninjaninja: Entering directo ...

  8. linux top 源码,在Linux系统中下载源码包安装Topgrade的方法,附Topgrade选项说明

    本文介绍在Linux操作系统中下载源码包安装Topgrade的方法,即下载topgrade-v2.3.0-x86_64-unknown-linux-gnu.tar.gz包并进行安装,经测试,在Ubun ...

  9. 详谈 vc++源码免杀全套思路方法

    首先说中国国内杀毒软件的特征 . 1  金山毒霸 ,我个人觉得杀的代码部分和字符串还是比较普遍的 .输入表函数 我个人不多见 . 2  瑞星 ,经实战经验 ,瑞星杀毒软件是垃圾. 过掉金山 也就过瑞星 ...

  10. 古月居 机器人开发实践源码 编译报错问题解决方法

    ubuntu:16.04.7 ros:kinetic 移植<机器人开发实践>源码包 ros_exploring,出现的问题都包含于以下内容中. 书中提到,如果将源码包 ros_explor ...

最新文章

  1. win10不能访问局域网共享
  2. 快速mysql导入sql文件_mysql肿么快速从sql文件导入数据库
  3. Spring Cloud Alibaba - 25 Gateway-路由断言工厂Route Predicate Factories谓词工厂示例及源码解析
  4. 最坏情况为线性时间的选择算法
  5. Azkaban的Web Server源码探究系列20:resolvebuildFlow
  6. Linux系统编程(五)时序竞态
  7. stun服务器搭建(coTurn)
  8. 2017计算机基础教学大纲,2017级大学计算机基础教学大纲
  9. 解决 /lib64/libc.so.6: version `GLIBC_2.18' not found (required by /lib64/libstdc++.so.6)
  10. TopCoder中插件的用法
  11. Atitit 建设自己的财政体系 attilax总结 1.1. 收入理论 2 1.2. 收入分类 2 1.3. 2 1.4. 非货币收入 2 1.5. 2 1.6. 降低期望 2 1.7.
  12. flash制作文字笔顺_Flash中使用逐帧动画实现按笔顺书写汉字的效果
  13. 飞翔(风吹)的flash文字
  14. 用matlab的dsp软件仿真,基于MATLAB的DSP软件仿真
  15. 微信小程序----实现YDUI的ScrollTab(滚动选项卡)
  16. 理解 Rack 应用及其中间件
  17. 微软xgp有哪些地区服务器,选择微软XGP订阅服务后,除了《荒野大镖客2》还有这些游戏值得玩...
  18. 渝粤题库 陕西师范大学 《综合英语(二)》作业
  19. Connection could not be established with host smtp.163.com 阿星小栈
  20. matlab实现拍照功能,matlab下拍照功能的实现

热门文章

  1. Ubuntu下查看隐藏文件
  2. 二级公共基础知识总结笔记
  3. 基站定位(Google API)
  4. 小学数学题的Java实现
  5. wuauclt.exe进程和wuauclt病毒的查杀清理方法
  6. 编程网站:21 个学习网站推荐给你,大部分编程语言都在这里了
  7. 《房地产证》与《房屋所有权证》或《房产证》有什么区别
  8. 听过闰年闰月,可你听过闰秒吗?
  9. 用JS逐步分解实现放大镜(看完就有收获)
  10. 盾神与砝码称重java_[蓝桥杯][算法提高VIP]盾神与砝码称重 (Java代码)