ThinkPHP5的配置非常重要,将会影响到整个应用的生命周期,TP5中的配置类Config.php,代码非常的简洁。

在教学过程中,发现很多的同学,都不愿意去看框架源码,认为会用就行,其实这种观点是错误的。

如果想快速提高自己的框架开发水平,阅读源码是最快的路径,其实源码没有大家想象的晦涩难懂。

从本课起,我将带着大家一起,慢慢的把ThinkPHP5的主要类的源码快速过一遍。相信学完后,,你会有:【哇,原来如此~~】的感觉!

本课先讲一个配置类Config.php的源码,该类文件位于: thinkphp/library/think/Config.php

一、Config.php类的源代码如下:<?php

// +----------------------------------------------------------------------

// | ThinkPHP [ WE CAN DO IT JUST THINK ]

// +----------------------------------------------------------------------

// | Copyright (c) 2006~2017 http://thinkphp.cn All rights reserved.

// +----------------------------------------------------------------------

// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )

// +----------------------------------------------------------------------

// | Author: liu21st

// +----------------------------------------------------------------------

namespace think;

class Config

{

// 配置参数

private static $config = [];

// 参数作用域

private static $range = '_sys_';

// 设定配置参数的作用域

public static function range($range)

{

self::$range = $range;

if (!isset(self::$config[$range])) {

self::$config[$range] = [];

}

}

/**

* 解析配置文件或内容

* @param string $config 配置文件路径或内容

* @param string $type 配置解析类型

* @param string $name 配置名(如设置即表示二级配置)

* @param string $range 作用域

* @return mixed

*/

public static function parse($config, $type = '', $name = '', $range = '')

{

$range = $range ?: self::$range;

if (empty($type)) {

$type = pathinfo($config, PATHINFO_EXTENSION);

}

$class = false !== strpos($type, '\\') ? $type : '\\think\\config\\driver\\' . ucwords($type);

return self::set((new $class())->parse($config), $name, $range);

}

/**

* 加载配置文件(PHP格式)

* @param string $file 配置文件名

* @param string $name 配置名(如设置即表示二级配置)

* @param string $range 作用域

* @return mixed

*/

public static function load($file, $name = '', $range = '')

{

$range = $range ?: self::$range;

if (!isset(self::$config[$range])) {

self::$config[$range] = [];

}

if (is_file($file)) {

$name = strtolower($name);

$type = pathinfo($file, PATHINFO_EXTENSION);

if ('php' == $type) {

return self::set(include $file, $name, $range);

} elseif ('yaml' == $type && function_exists('yaml_parse_file')) {

return self::set(yaml_parse_file($file), $name, $range);

} else {

return self::parse($file, $type, $name, $range);

}

} else {

return self::$config[$range];

}

}

/**

* 检测配置是否存在

* @param string $name 配置参数名(支持二级配置 .号分割)

* @param string $range 作用域

* @return bool

*/

public static function has($name, $range = '')

{

$range = $range ?: self::$range;

if (!strpos($name, '.')) {

return isset(self::$config[$range][strtolower($name)]);

} else {

// 二维数组设置和获取支持

$name = explode('.', $name);

return isset(self::$config[$range][strtolower($name[0])][$name[1]]);

}

}

/**

* 获取配置参数 为空则获取所有配置

* @param string $name 配置参数名(支持二级配置 .号分割)

* @param string $range 作用域

* @return mixed

*/

public static function get($name = null, $range = '')

{

$range = $range ?: self::$range;

// 无参数时获取所有

if (empty($name) && isset(self::$config[$range])) {

return self::$config[$range];

}

if (!strpos($name, '.')) {

$name = strtolower($name);

return isset(self::$config[$range][$name]) ? self::$config[$range][$name] : null;

} else {

// 二维数组设置和获取支持

$name = explode('.', $name);

$name[0] = strtolower($name[0]);

return isset(self::$config[$range][$name[0]][$name[1]]) ? self::$config[$range][$name[0]][$name[1]] : null;

}

}

/**

* 设置配置参数 name为数组则为批量设置

* @param string|array $name 配置参数名(支持二级配置 .号分割)

* @param mixed $value 配置值

* @param string $range 作用域

* @return mixed

*/

public static function set($name, $value = null, $range = '')

{

$range = $range ?: self::$range;

if (!isset(self::$config[$range])) {

self::$config[$range] = [];

}

if (is_string($name)) {

if (!strpos($name, '.')) {

self::$config[$range][strtolower($name)] = $value;

} else {

// 二维数组设置和获取支持

$name = explode('.', $name);

self::$config[$range][strtolower($name[0])][$name[1]] = $value;

}

return;

} elseif (is_array($name)) {

// 批量设置

if (!empty($value)) {

self::$config[$range][$value] = isset(self::$config[$range][$value]) ?

array_merge(self::$config[$range][$value], $name) :

self::$config[$range][$value] = $name;

return self::$config[$range][$value];

} else {

return self::$config[$range] = array_merge(self::$config[$range], array_change_key_case($name));

}

} else {

// 为空直接返回 已有配置

return self::$config[$range];

}

}

/**

* 重置配置参数

*/

public static function reset($range = '')

{

$range = $range ?: self::$range;

if (true === $range) {

self::$config = [];

} else {

self::$config[$range] = [];

}

}

}

二、源代码解读的思维导图:

三、思维导图文字说明:

配置类Config.php

1 位置:thinkphp/library/think/Config.php

2 属性(2个)

2.1 private static $config = [];

2.1.1 内容:配置参数

2.1.2 访问类型:私有静态,仅限类中静态方法用self::访问

2.1.3 接受值类型:Array数组

2.2 private static $range = '_sys_';

2.2.1 内容:配置参数的作用域

2.2.2 访问类型:私有静态,仅限类中静态方法用self::访问

2.2.3 接受值类型:String字符串

3 方法(7个)

3.1 public static function range($range)

3.1.1 功能:设定配置参数的作用域

3.1.2 访问类型:公共静态,供外部用类名Config::访问

3.1.3 输入参数:$range,string类型,表示配置作用域的字符串

3.1.4 返回结果:给配置作用域属性$rang赋值

3.2 public static function parse($config, $type = '', $name = '', $range = '')

3.2.1 功能:解析配置文件或内容

3.2.2 访问类型:公共静态,供外部用类名Config::访问

3.2.3 输入参数

3.2.3.1 string $config 配置文件路径或内容

3.2.3.2 string $type 配置解析类型

3.2.3.3 string $name 配置名(如设置即表示二级配置)

3.2.3.4 string $range 作用域

3.2.4 返回结果:mixed 不确定类型或任何类型

3.3 public static function load($file, $name = '', $range = '')

3.3.1 功能:加载配置文件(PHP格式)

3.3.2 访问类型:公共静态,供外部用类名Config::访问

3.3.3 输入参数

3.3.3.1 string $file 配置文件名

3.3.3.2 string $name 配置名(如设置即表示二级配置)

3.3.3.3 string $range 作用域

3.3.4 返回结果:mixed 不确定类型或任何类型

3.4 public static function has($name, $range = '')

3.4.1 功能:检测配置是否存在

3.4.2 访问类型:公共静态,供外部用类名Config::访问

3.4.3 输入参数

3.4.3.1 $name 配置参数名(支持二级配置 .号分割)

3.4.3.2 string $range 作用域

3.4.4 返回结果:bool布尔类型,存在为true,否则为false

3.5 public static function get($name = null, $range = '')

3.5.1 功能:获取配置参数 为空则获取所有配置

3.5.2 访问类型:公共静态,供外部用类名Config::访问

3.5.3 输入参数

3.5.3.1 string $name 配置参数名(支持二级配置 .号分割)

3.5.3.2 string $range 作用域

3.5.4 返回结果:mixed 不确定类型或任何类型

3.6 public static function set($name, $value = null, $range = '')

3.6.1 功能:设置配置参数 name为数组则为批量设置

3.6.2 访问类型:公共静态,供外部用类名Config::访问

3.6.3 输入参数

3.6.3.1 string|array $name 配置参数名(支持二级配置 .号分割)

3.6.3.2 mixed $value 配置值

3.6.3.3 string $range 作用域

3.6.4 返回结果:mixed 不确定类型或任何类型

3.7 public static function reset($range = '')

3.7.1 功能:重置配置参数

3.7.2 访问类型:公共静态,供外部用类名Config::访问

3.7.3 输入参数:string $range 作用域

3.7.4 返回结果:self::$config=[];//清空配置数组

四、思维导图源文件下载:xmind格式

【相关推荐】

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

图解think php,图解ThinkPHP5框架(三):配置类Config.php源码解读相关推荐

  1. Elasticsearch-Jest 配置ES集群源码解读

    文章目录 Jest Github地址 搭建源码环境 Jest配置ES集群 Jest 配置ES集群,确保应用高可用的原理探究 初始化 JestClient NodeChecker 源码分析 发起请求的过 ...

  2. SpringSecurity权限管理框架系列(六)-Spring Security框架自定义配置类详解(二)之authorizeRequests配置详解

    1.预置演示环境 这个演示环境继续沿用 SpringSecurit权限管理框架系列(五)-Spring Security框架自定义配置类详解(一)之formLogin配置详解的环境. 2.自定义配置类 ...

  3. Android 开源框架之 Android-async-http 源码解读

    开源项目链接 Android-async-http仓库:https://github.com/loopj/android-async-http android-async-http主页:http:// ...

  4. php yii框架源码,yii 源码解读

    date: 2017-11-21 18:15:18 title: yii 源码解读 本篇博客阅读指南: php & 代码提示: 工欲善其事必先利其器 yii 源码阅读指南: 整体上全貌上进行了 ...

  5. 微前端框架 之 qiankun 从入门到源码分析

    当学习成为了习惯,知识也就变成了常识.感谢各位的 点赞.收藏和评论. 新视频和文章会第一时间在微信公众号发送,欢迎关注:李永宁lyn 文章已收录到 github,欢迎 Watch 和 Star. 简介 ...

  6. Bert系列(三)——源码解读之Pre-train

    https://www.jianshu.com/p/22e462f01d8c pre-train是迁移学习的基础,虽然Google已经发布了各种预训练好的模型,而且因为资源消耗巨大,自己再预训练也不现 ...

  7. Slim 框架源码解读

    0x00 前言 Slim 是由<PHP The Right Way>作者开发的一款 PHP 微框架,代码量不算多(比起其它重型框架来说),号称可以一下午就阅读完(我觉得前提是熟悉 Slim ...

  8. 什么是Mybatis配置解析?(源码+图文)

    什么是Mybatis配置解析?(源码+图文) 1. 核心配置文件 mybatis-config.xml configuration(配置)properties(属性)settings(设置)typeA ...

  9. java ssm框架论文,基于SSM框架的个人博客系统(源码+论文)

    需求分析 使用spring+springmvc+mybatis实现一个个人博客系统,可以记录个人生活日志, 进行技术分享, 并且浏览者可以对博客进行阅览与评论 本站提供了其他类型的 在线个人博客网站源 ...

  10. SSM框架基于web的房屋租售管理系统源码+论文第二稿+软件环境+包安装调试

    项目名称 SSM框架基于web的房屋租售管理系统源码 系统说明 用户: 1.首页:系统前台首页使用分块的结构设计进行展示,分别对系统的logo.轮播图.登录注册.新闻公告.最新房源.菜单功能.房屋类型 ...

最新文章

  1. TensorFlow2简单入门-单词嵌入向量
  2. 利用cookie显示上次浏览的时间
  3. html点击圆点箭头分页,css实现小箭头的实现方式
  4. Linux下动态库的创建与更新
  5. ubuntu上安装rsync+sersync
  6. 仿QQ聊天软件2.0版
  7. Spirent Testcenter基本配置使用说明_1022
  8. 电脑iphone,如何从 iPhone 传输图片到电脑
  9. Kali linux 基础常用指令详解
  10. html那种折叠文字内容怎么实现,html+css实现文字折叠特效实例
  11. Windows 10 “无法打开这个应用” 应用出现问题,应该怎么解决?
  12. 80端口跟8080端口有什么具体区别?
  13. 柯基数据企业知识图谱落地案例分享
  14. 使用install安装应用的时候出现INSTALL_FAILED_SHARED_USER_INCOMPATIBLE问题的解决方法
  15. linux没有无线wifi密码忘记,无线wifi密码忘记了怎么办_忘记无线网密码怎么办?-192路由网...
  16. 合肥工业大学计算机科学与技术教学计划,合肥工业大学计算机科学与技术学科硕士培养方案...
  17. 名画134 方从义《云山图卷》
  18. 第一章 Pandas基础
  19. istio流量管理和零信任安全配置
  20. 从4k到42k,程序员的涨薪史看哭了

热门文章

  1. SeaweedFS上手使用指南
  2. MySql 把B表数据插入到A表中
  3. Web安全实践(11)用户名枚举
  4. Apache服务器和tomcat服务器有什么区别(转)
  5. spring aop advice
  6. 【荐】Redis学习资料汇总
  7. 解决:VB.NET程序中 datagridview 多次绑定出现 的“不能在数据绑定的 DataGridView 控件上设置 ColumnCount...
  8. 在页面加载后执行任务
  9. MySQL服务器的启动与停止
  10. 异常处理:java.lang.ClassNotFoundException: javax.xml.bind.JAXBContext