本课共分10个模块,从配置文件格式(php/ini/json/xml)到场景配置,模块配置,扩展配置,独立配置,动态配置,自定义配置加载,环境变量变量,全景展现一个多彩的ThinkPHP5配置世界~~。
请将图打开到新网页查看,效果更好。或者下载到本地查看。本图由xmind思维导图制作,底部有xmind源文件下载,用xmind软件打开效果更棒。
一、思维导图:

二、文件描述:
ThinkPHP5框架配置
1 配置目录
1.1 默认配置目录
1.1.1 应用配置:application目录
1.1.2 模块配置: application/模块目录
1.2 自定义配置目录
1.2.1 入口文件中:define('CONF_PATH', __DIR__.'/../config/');
1.2.2 定义用户自定义配置文件目录和应用目录同级
1.2.3 应用配置文件包括三个:config.php/database.php/route.php
1.2.4 模块配置文件包括三个:config.php/database.php
1.2.5 路由在应用初始化时已生成,所以不要在模块中配置route.php
1.3 扩展配置目录
1.3.1 在应用或模块配置目录下创建extra目录
1.3.2 在extra目录下创建的配置文件名,就是扩展配置名称,所以扩展配置都是二维数组
1.在extra目录创建:myconf.php
2.在myconf.php文件中:<?php 
return [
'site_name'=>'www.php.cn',
];
3. 在控制器中访问:dump(\think\Config::get());
可以在最后面看到:["myconf"] => array(1) {
["site_name"] => string(10) "www.php.cn"
}
1.3.3 最终创建的扩展配置项,都会与应用配置项合并(dump(\think\Config::get());//查看)
2 配置格式
2.1 Array格式
2.1.1 这是默认格式,不用在入口文件中配置CONF_EXT常
2.1.2 配置文件:config.php,内容是用return 返回的数组<?php 
return [
'my_name' => '朱老师',
];
2.1.3 支持二配置,以二维数组表示<?php 
return [
'my_info' => [
'my_name' => '朱老师',
'my_age' => 28,
'my_sex' => '男',
],
];
2.1.4 返回内容自动与应用配置合并,以数组方式返回["my_info"] => array(3) {
["my_name"] => string(9) "朱老师"
["my_age"] => int(28)
["my_sex"] => string(3) "男"
}
2.2 ini格式
2.2.1 在入口文件中更改配置格式: define('CONF_EXT', '.ini');<?php 
// 定义应用目录
define('APP_PATH', __DIR__ . '/../application/');
//定义配置目录
define('CONF_PATH', __DIR__ . '/../config/');
// 更改配置格式为ini格式
define('CONF_EXT', '.ini');
// 加载框架引导文件
require __DIR__ . '/../thinkphp/start.php';
2.2.2 配置文件:config.ini,内容是由等号连接的名值对组成, 注释写在分号;后面
名称用匈牙利命名法,名值之间用等号连接,值不用定界符号config.ini
内容:
my_name=朱老师 ;我的姓名
;my_name是配置名称,朱老师是值,分号后面是该配置项的注释部分,可以省略
2.2.3 支持二级配置,配置项放在一对方括号中
config.ini中的二级配置内容[base_info]
my_name=朱老师;我的姓名
my_age=28 ;我的年龄
my_sex=男 ;我的性别
2.2.4 返回内容自动与应用配置合并,以数组方式返回
应用配置中返回结果是二维数组:["base_info"] => array(3) {
["my_name"] => string(9) "朱老师"
["my_age"] => string(2) "28"
["my_sex"] => string(3) "男"
}
2.3 xml格式
2.3.1 在入口文件中更改配置格式: define('CONF_EXT', '.xml');<?php 
// 定义应用目录
define('APP_PATH', __DIR__ . '/../application/');
//定义配置目录
define('CONF_PATH', __DIR__ . '/../config/');
// 更改配置格式为ini格式
define('CONF_EXT', '.xml');
// 加载框架引导文件
require __DIR__ . '/../thinkphp/start.php';
2.3.2 配置文件:config.xml,配置项放在一对标签中,标签名就是配置项
安徽省合肥市
安徽省合肥市
2.3.3 支持二级配置,配置项放在一对标签中
安徽省合肥市
中文网
2.3.4 返回内容自动与应用配置合并,以数组方式返回
应用配置中返回结果是二维数组:["info"] => array(2) {
["my_home"] => string(18) "安徽省合肥市"
["my_work"] => string(9) "中文网"
}
2.4 json格式
2.4.1 在入口文件中更改配置格式: define('CONF_EXT', '.json');<?php 
// 定义应用目录
define('APP_PATH', __DIR__ . '/../application/');
//定义配置目录
define('CONF_PATH', __DIR__ . '/../config/');
// 更改配置格式为ini格式
define('CONF_EXT', '.xml');
// 加载框架引导文件
require __DIR__ . '/../thinkphp/start.php';
2.4.2 配置文件:config.json,配置项放在json对象中,配置项的名值对用javascript对象表示{
"my_name":"朱老师",
"my_age":28,
"my_sex":"男"
}
特别注意:最后一个配置项后面,千万不要加逗号
2.4.3 支持二级配置,配置项放在一对标签中{
"base_info":{
"my_name":"朱老师",
"my_age":28,
"my_sex":"男"
}
}
很简单,在所有配置上的上一级再加一层,再把当前数据嵌套进去就可以了。
2.4.4 返回内容自动与应用配置合并,以数组方式返回["base_info"] => array(3) {
["my_name"] => string(9) "朱老师"
["my_age"] => int(28)
["my_sex"] => string(3) "男"
}
3 场景配置
3.1 用途:在不同的环境下,使用不同的配置项
3.2 修改应用配置config.php中'app_status'=>'场景名称',
这个场景名称,对应着应用配置目录下面一个配置文件,该配置文件内容默认是数组方式。
例如,你可能在家中工作,使用的数据库连接参数与办公室是不一样的。
那么你可以先将:
'app_status'=>'home',设置为home家中
同样,如果你到了公司,要换成公司的数据库,可以在应用配置文件中:<?php 
return [
// 应用模式状态,将home改成office
'app_status' => 'office',
];
3.3 在应用配置目录下创建与场景名称同名的php文件做为配置文件,以数组方式返回配置项
然后在当前应用配置目录下面创建一个:home.php文件
里面写上如下内容:
实际上就是database.php中的内容复制一份就行。<?php 
return [
// 数据库类型
'type' => 'mysql',
// 服务器地址
'hostname' => 'localhost',
// 数据库名
'database' => 'home',
// 用户名
'username' => 'root_home',
// 密码
'password' => 'root_home',
// 端口
'hostport' => '',
// 连接dsn
'dsn' => '',
// 数据库连接参数
'params' => [],
// 数据库编码默认采用utf8
'charset' => 'utf8',
// 数据库表前缀
'prefix' => '',
// 数据库调试模式
'debug' => true,
// 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)
'deploy' => 0,
// 数据库读写是否分离 主从式有效
'rw_separate' => false,
// 读写分离后 主服务器数量
'master_num' => 1,
// 指定从服务器序号
'slave_no' => '',
// 是否严格检查字段是否存在
'fields_strict' => true,
// 数据集返回类型
'resultset_type' => 'array',
// 自动写入时间戳字段
'auto_timestamp' => false,
// 时间字段取出后的默认时间格式
'datetime_format' => 'Y-m-d H:i:s',
// 是否需要进行SQL性能分析
'sql_explain' => false,
// Builder类
'builder' => '',
// Query类
'query' => '\\think\\db\\Query',
];
同样,如果你到了公司,要换成公司的数据库,
然后在应用配置目录下创建office.php文件,将数据库配置信息写入,以数据形式返回,就可以了。
4 模块配置
4.1 模块也可以有自己的独立配置:模块名/config.php
4.2 模块配置优先于应用配置,相同配置会覆盖应用配置
4.3 模块也支持场景状态配置,原理与步骤与应用一致
1.创建模块配置文件: application/index/config.php
2. 添加配置项,修改应用状态<?php 
return [
// 模块模式状态
'app_status' => 'module_office',
];
3.在index模块目录下创建: modult_office.php,做为模块的场景状态配置文件
文件内容也以数据库连接为例:<?php 
return [
// 数据库类型
'type' => 'mysql',
// 服务器地址
'hostname' => 'localhost',
// 数据库名
'database' => 'modult_office',
// 用户名
'username' => 'modult_office',
// 密码
'password' => 'modult_office',
// 端口
'hostport' => '',
// 连接dsn
'dsn' => '',
// 数据库连接参数
'params' => [],
// 数据库编码默认采用utf8
'charset' => 'utf8',
// 数据库表前缀
'prefix' => '',
// 数据库调试模式
'debug' => true,
// 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)
'deploy' => 0,
// 数据库读写是否分离 主从式有效
'rw_separate' => false,
// 读写分离后 主服务器数量
'master_num' => 1,
// 指定从服务器序号
'slave_no' => '',
// 是否严格检查字段是否存在
'fields_strict' => true,
// 数据集返回类型
'resultset_type' => 'array',
// 自动写入时间戳字段
'auto_timestamp' => false,
// 时间字段取出后的默认时间格式
'datetime_format' => 'Y-m-d H:i:s',
// 是否需要进行SQL性能分析
'sql_explain' => false,
// Builder类
'builder' => '',
// Query类
'query' => '\\think\\db\\Query',
];
4. 保存后,打开浏览器查看,可以看到配置更新结果
5 其它位置的配置文件
5.1 全部在控制器的方法中动态调用Config类中的方法完成手工加载
5.2 用Config::load(配置文件):可以加载任何位置的配置文件,默认Array格式
先在与config目录中创建同级的newconf目录,在该目录下创建conf.php,如果是.php文件,就默认是以数组方式返回配置项,采用Config::load()方法手工动态加载
config/newconf/conf.php文件内容<?php 
return [
'user_define' =>'www.php.cn'
];
控制器中的:index/index/中的index方法<?php 
namespace app\index\controller;
class Index
{
public function index()
{
//手工加载指定目录下的配置文件,注意Config类的命名空间
\think\Config::load(APP_PATH.'../config/newconf/conf.php');
dump(\think\Config::get());
}
}
5.3 如果是其它格式(ini/xml/json)用Config::parse(文件,'类型')来加载
先在与config目录中创建同级的newconf目录,在该目录下创建conf.ini,按框架的约定,不论是什么格式的配置文件,最终必须是以数组方式返回配置项,所以第一步就是要将其它格式的数组,解析成数组,所以就不能再用Config::load()方法了,Config类提供了一个Config::parse()方法来加载其它格式的配置文件,这个方法有二个参数,第一个是要加载的配置文件,第二个就是当前配置文件的格式,如ini,xml或json等
我们以ini格式为例
config/newconf/conf.ini文件内容my_system = mac_os
my_phone = huawei
控制器中的:index/index/中的index方法<?php 
namespace app\index\controller;
class Index
{
public function index()
{
//手工加载指定目录下的配置文件,注意Config类的命名空间
\think\Config::parse(APP_PATH.'../config/newconf/conf.ini','ini');
dump(\think\Config::get());
}
}
5.4 最终与前面一样,都是与应用配置合并后以数组方式返回全部配置项["my_system"] => string(6) "mac_os"
["my_phone"] => string(6) "huawei"
6 读取配置项
6.1 方法1:Config::get('参数'),不传入参数则是读取应用的全部配置项
6.2 方法二:作用助手函数config(),不需要导入命名空间直接使用,效率低不推荐
6.3 Config::get('my_info.my_system')方法可以读取二级配置,配置项之间用.点连接
6.4 Config::has(''app_status''):has方法检测某个配置项是否存在,返回布尔值
在控制器中检测:某个配置项是否存在<?php 
namespace app\index\controller;
class Index
{
public function index()
{
dump(\think\Config::has('app_status'));
}
}
6.5 如何用助手函数:config('?配置参数');也返回布尔值<?php 
namespace app\index\controller;
class Index
{
public function index()
{
dump(config('?app_status'));
}
}
7 动态设置参数
7.1 配置项可以写在配置文件,也可以用Config::set()方法动态设置
7.2 Config::set(名称,值),可以逐个设置,也可用数组批量设置:Config::set(数组)
一、名值对方式,逐个设置<?php 
namespace app\index\controller;
class Index
{
public function index()
{
\think\Config::set('site_domain','www.php.cn');
dump(\think\Config::get());
}
}
二、数组方式,批量设置<?php 
namespace app\index\controller;
use think\Config;
class Index
{
public function index()
{
$config = [
'site_domain' => 'www.php.cn',
'site_name' => 'PHP中文网',
'php_tools' => 'PHP程序员工具箱',
];
Config::set($config);
dump(Config::get());
}
}
7.3 助手函数config(名值对/数组),也可以进行动态设置
将上面的用Config类的代码微微改一下就行,
去掉上面的空间导入
将Config::set()和Config::get()全部换成config()就可了。<?php 
namespace app\index\controller;
class Index
{
public function index()
{
$config = [
'site_domain' => 'www.php.cn',
'site_name' => 'PHP中文网',
'php_tools' => 'PHP程序员工具箱',
];
config($config);
dump(config());
}
}
8 独立配置文件
8.1 5.0.1以上版本,直接将独立配置文件放在应用或模块的extra目录下即可
自动读取的独配置文件都是二级配置参数,一级配置名称就是扩展配置的文件名。
8.2 默认设置了2个独立配置文件,database.php(数据库配置) 和 validate.php(验证规 则)
8.3 四类默认加载的独立配置文件不用放在extra目录下
8.3.1 应用或者模块配置文件:config.php
8.3.2 数据库配置文件:database.php
8.3.3 行为定义文件:tags.php
8.3.4 场景配置文件:例如home.php,office.php
9 配置参数的作用域
9.1 类似于命名空间,以二维数组方式来收纳参数
9.2 切换作用域: Config::range(),默认值为:_sys_
9.3 可以将扩展配置或独立配置归纳到作用域,或动态设置Config::set()<?php 
namespace app\index\controller;
use think\Config;
class Index
{
public function index()
{
//设置一组配置项
$config = [
'user_name'=>'peter',
'user_age'=>28,
];
//批量设置,写入user作用域
Config::set($config,'user');
//输出全部配置项,发现作用域相当于二维数组名称
dump(Config::get());
//用二维数组方式获取user作用域中的user_name值
dump(Config::get('user.user_name'));
//同样用数组的方式来设置配置项的值
Config::set('user.user_name','php.cn');
echo '
'; 
 
//查看设置好的新值
dump(Config::get('user.user_name'));
//切换作用域到系统全局_sys_(默认):用 Config::range()方法
Config::range('_sys_');
//查看全部配置项
dump(Config::get());
}
}
10 系统环境变量配置
10.1 在应用同级目录创建.env文件来模拟系统变量,内容格式为:iniapp_status = office ;配置场景为office
10.2 原生方法:获取系统环境变量:$_ENV,getenv(变量名),
10.3 TP提供Env.php类,该类只有一个方法:Env::get(变量名)来获取环境变量
10.4 .env文件不支持非标量,如需使用数组,要用_下划线连接方式进行参数分级设置
注意,环境变量不支持数组参数,如果需要使用数组参数可以,使用下划线分割定义配置参数名:database_username = database_password = root 123456
//或者使用
[database] username = password = root 123456
10.5 对于数组参数,访问时可以用下划线或者.点语法都可以
获取环境变量的值可以使用下面的两种方式获取:Env::get('database.username'); Env::get('database.password');
// 同时下面的方式也可以获取
Env::get('database_username');
Env::get('database_password');
可以支持默认值,例如:
// 获取环境变量 如果不存在则使用默认值root Env::get('database.username','root');
10.6 环境变量读取优先于应用配置参数,所以可以配置参数中引用环境变量
可以直接在应用配置中使用环境变量,例如:return [ 'hostname' => Env::get('hostname','127.0.0.1'), ];