1、配置基础
惯例配置->应用配置->模块配置->动态配置
- 惯例配置:核心框架内置的配置文件,无需更改。
- 应用配置:每个应用的全局配置文件(框架安装后会生成初始的应用配置文件),有部分配置参数仅能在应用配置文件中设置。
- 模块配置:每个模块的配置文件(相同的配置参数会覆盖应用配置),有部分配置参数模块配置是无效的,因为已经使用过。
- 动态配置:主要是指在控制器或者行为中进行(动态)更改配置,该配置方式只在当次请求有效,因为不会保存到配置文件中。
只能应用配置中设置参数如下:
配置参数 | 描述 |
---|---|
app_debug | 应用调试模式(支持环境变量配置) |
app_trace | 应用trace(支持环境变量配置) |
class_suffix | 类后缀 |
default_filter | 默认过滤机制 |
root_namespace | 根命名空间 |
pathinfo_depr | PATH_INFO分隔符 |
url_route_must | 路由强制模式 |
auto_bind_module | 自动绑定模块 |
default_lang | 默认语言 |
lang_switch_on | 多语言切换 |
只能环境变量中修改的参数如下:
配置参数 | 描述 |
---|---|
app_namespace | 应用命名空间 |
config_ext | 配置文件后缀 |
2、架构总览
- 入口文件
- 应用
- 路由
- 模块
- 控制器
- 操作(方法)
- 模型
- 视图
- 板引擎
- 驱动
- 行为
- 中间件
- 事件
- 助手函数
3、环境变量
5.1版本取消了所有的系统常量,原来的系统路径变量改为使用Env
类获取(需要引入think\facade\Env
):
// 获取应用目录(不区分大小写)
echo Env::get('app_path');
// 或者
echo Env::get('APP_PATH');
支持获取的系统路径变量包括:
系统路径 | Env参数名称 |
---|---|
应用根目录 | root_path |
应用目录 | app_path |
框架目录 | think_path |
配置目录 | config_path |
扩展目录 | extend_path |
composer目录 | vendor_path |
运行缓存目录 | runtime_path |
路由目录 | route_path |
当前模块目录 | module_path |
系统路径 | Env参数名称 |
应用根目录 | root_path |
应用目录 | app_path |
框架目录 | think_path |
配置目录 | config_path |
扩展目录 | extend_path |
composer目录 | vendor_path |
运行缓存目录 | runtime_path |
路由目录 | route_path |
当前模块目录 | module_path |
4、命名空间
特别注意的是,如果你需要调用PHP内置的类库,或者第三方没有使用命名空间的类库,记得在实例化类库的时候加上 \
,例如:
// 错误的用法
$class = new stdClass();
$xml = new SimpleXmlElement($xmlstr);
// 正确的用法
$class = new \stdClass();
$xml = new \SimpleXmlElement($xmlstr);
从ThinkPHP5.0
开始,遵循PSR-4
自动加载规范,只需要给类库正确定义所在的命名空间,并且命名空间的路径与类库文件的目录一致,那么就可以实现类的自动加载,从而实现真正的惰性加载。
例如,\think\cache\driver\File
类的定义为:
namespace think\cache\driver;
class File
{
}
如果我们实例化该类的话,应该是:
$class = new \think\cache\driver\File();
系统会自动加载该类对应路径的类文件,其所在的路径是 thinkphp/library/think/cache/driver/File.php
。
注:5.1
版本默认的目录规范是小写,类文件命名是驼峰法,并且首字母大写。
5、容器和依赖注入
依赖注入其实本质上是指对类的依赖通过构造器完成自动注入,例如在控制器架构方法和操作方法中一旦对参数进行对象类型约束则会自动触发依赖注入,由于访问控制器的参数都来自于URL请求,普通变量就是通过参数绑定自动获取,对象变量则是通过依赖注入生成。其实就是java的对象参数,这个概念豪头太大,又不好记。
<?php
namespace app\index\controller;
use app\index\model\User;
class Index
{
protected $user;
public function __construct(User $user)
{
$this->user = $user;
}
public function hello()
{
return 'Hello,' . $this->user->name . '!';
}
}
系统内置绑定到容器中的类库包括:
系统类库 | 容器绑定标识 |
---|---|
think\Build | build |
think\Cache | cache |