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

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] = [];

}

}

}

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

96f4d85882eae305f2330f7b98aba0d2.png

三、思维导图文字说明:

配置类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中文网,转载请注明出处,感谢您的尊重!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值