TP5源码分析-执行应用【initialize方法分析】
文章目录
- 回顾
- 分析
回顾
- 上一节我们分析了 执行应用的图解,也就是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方法分析】相关推荐
- mybatis源码之执行insert代码分析
系列文档: mybatis源码之创建SqlSessionFactory代码分析 mybatis源码之创建SqlSessionFactory代码分析 - mapper xml解析 mybatis源码之执 ...
- spring源码依赖注入的核心方法populateBean(beanName, mbd, instanceWrapper)分析
spring源码依赖注入的核心方法populateBean(beanName, mbd, instanceWrapper)分析:通过源码我们发现在分析这个方法之前,此对象已经创建完成实例,内存开辟了空 ...
- 源码|批量执行invokeAll()多选一invokeAny()
ExecutorService中定义了两个批量执行任务的方法,invokeAll()和invokeAny(),在批量执行或多选一的业务场景中非常方便.invokeAll()在所有任务都完成(包括成功/ ...
- 分析开源项目源码,我们该如何入手分析?(授人以渔)
点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:牛人 20000 字的 Spring Cloud 总结,太硬核了~ 1 前言 本文接上篇文章跟大家聊聊我们为什么 ...
- php5.5n的redis,TP5源码 Redis操作便捷类库
# TP5源码 Redis操作便捷类库 > app\base\controller\Redis ~~~ /** * Created by PhpStorm. * Power by Mikkle ...
- jQuery方法源码解析--jQuery($)方法(一)
jQuery方法源码解析--jQuery($)方法 注: 1.本文分析的代码为jQuery.1.11.1版本,在官网上下载未压缩版即可 2.转载请注明出处 jQuery方法: 这个方法大家都不陌生,在 ...
- 编译Android7.1源码出现OOM错误解决方法
一:编译Android7.1源码出现OOM错误解决方法 在Android7.1编译过程中出现如下错误: Starting build with ninjaninja: Entering directo ...
- linux top 源码,在Linux系统中下载源码包安装Topgrade的方法,附Topgrade选项说明
本文介绍在Linux操作系统中下载源码包安装Topgrade的方法,即下载topgrade-v2.3.0-x86_64-unknown-linux-gnu.tar.gz包并进行安装,经测试,在Ubun ...
- 详谈 vc++源码免杀全套思路方法
首先说中国国内杀毒软件的特征 . 1 金山毒霸 ,我个人觉得杀的代码部分和字符串还是比较普遍的 .输入表函数 我个人不多见 . 2 瑞星 ,经实战经验 ,瑞星杀毒软件是垃圾. 过掉金山 也就过瑞星 ...
- 古月居 机器人开发实践源码 编译报错问题解决方法
ubuntu:16.04.7 ros:kinetic 移植<机器人开发实践>源码包 ros_exploring,出现的问题都包含于以下内容中. 书中提到,如果将源码包 ros_explor ...
最新文章
- win10不能访问局域网共享
- 快速mysql导入sql文件_mysql肿么快速从sql文件导入数据库
- Spring Cloud Alibaba - 25 Gateway-路由断言工厂Route Predicate Factories谓词工厂示例及源码解析
- 最坏情况为线性时间的选择算法
- Azkaban的Web Server源码探究系列20:resolvebuildFlow
- Linux系统编程(五)时序竞态
- stun服务器搭建(coTurn)
- 2017计算机基础教学大纲,2017级大学计算机基础教学大纲
- 解决 /lib64/libc.so.6: version `GLIBC_2.18' not found (required by /lib64/libstdc++.so.6)
- TopCoder中插件的用法
- Atitit 建设自己的财政体系 attilax总结 1.1. 收入理论	2 1.2. 收入分类	2 1.3. 	2 1.4. 非货币收入	2 1.5. 	2 1.6. 降低期望	2 1.7.
- flash制作文字笔顺_Flash中使用逐帧动画实现按笔顺书写汉字的效果
- 飞翔(风吹)的flash文字
- 用matlab的dsp软件仿真,基于MATLAB的DSP软件仿真
- 微信小程序----实现YDUI的ScrollTab(滚动选项卡)
- 理解 Rack 应用及其中间件
- 微软xgp有哪些地区服务器,选择微软XGP订阅服务后,除了《荒野大镖客2》还有这些游戏值得玩...
- 渝粤题库 陕西师范大学 《综合英语(二)》作业
- Connection could not be established with host smtp.163.com 阿星小栈
- matlab实现拍照功能,matlab下拍照功能的实现