本文目录导读:

在 ThinkPHP 项目中,调试模式和变量输出是开发过程中非常重要的功能,下面详细讲解这两部分内容。
调试模式
开启调试模式
在 ThinkPHP 中,调试模式通过 APP_DEBUG 常量控制,在入口文件(如 public/index.php)中设置:
// 开启调试模式
define('APP_DEBUG', true);
// 关闭调试模式(生产环境)
// define('APP_DEBUG', false);
注意事项:
- 生产环境必须关闭调试模式,否则会暴露敏感信息,影响性能
- 调试模式开启后会显示详细的错误信息、SQL 日志、页面 Trace 信息等
调试模式的影响
开启调试模式后:
| 功能 | 开启调试模式 | 关闭调试模式 |
|---|---|---|
| 错误信息 | 显示详细错误 | 显示友好错误页 |
| SQL 日志 | 记录并显示 | 不记录 |
| 页面 Trace | 显示 | 不显示 |
| 缓存 | 不使用 | 使用 |
| 模板编译缓存 | 每次编译 | 编译缓存 |
变量输出方法
dump() 函数
这是最常用的调试输出函数,功能类似 PHP 的 var_dump(),但输出格式化更美观:
// 在控制器中
public function test() {
$data = ['name' => 'Tom', 'age' => 20];
$user = new User();
// 输出数组
dump($data);
// 输出对象
dump($user);
// 输出多个变量
dump($data, $user);
// 停止执行
dump($data);die; // 或使用 halt()
}
halt() 函数
halt() 是 dump() 和 die() 的组合,输出后终止程序执行:
public function test() {
$data = ['name' => 'Tom'];
halt($data); // 输出后停止执行
echo '这段代码不会执行';
}
var_dump() 和 print_r()
PHP 原生函数,在 ThinkPHP 中也可以使用:
public function test() {
$data = ['name' => 'Tom'];
var_dump($data); // 显示数据类型和值
print_r($data); // 只显示值,格式更简洁
}
使用日志调试
记录日志
ThinkPHP 提供了日志功能,用于记录调试信息:
use think\facade\Log;
public function test() {
$data = ['name' => 'Tom'];
// 记录不同级别的日志
Log::info('这是一个信息日志');
Log::error('这是一个错误日志');
Log::debug('调试信息:' . json_encode($data));
Log::warning('警告信息');
// 记录到特定通道
Log::channel('debug')->info('自定义通道日志');
}
查看日志
日志默认保存在 runtime/log/ 目录下,按日期分文件:
runtime/log/
├── 202401/ # 月份目录
│ ├── 01.log # 日期文件
│ ├── 02.log
│ └── ...
└── ...
使用 Trace 调试
开启 Trace
在 config/app.php 中配置:
// 应用调试模式 'app_trace' => true, // 开启页面Trace
Trace 面板内容
开启后页面底部会显示 Trace 面板,包含:
- 运行时间
- 加载文件数
- 数据库查询次数
- SQL 语句
- 缓存使用情况
- 会话信息
- 包含的 PHP 文件列表
变量输出到页面
模板变量输出
在控制器中分配变量到模板,然后在模板中输出:
// 控制器
public function test() {
$name = 'Tom';
$data = ['name' => 'Tom', 'age' => 20];
return view('index/test', [
'name' => $name,
'data' => $data
]);
}
<!-- 模板文件 views/index/test.html -->
<!DOCTYPE html>
<html>
<head>变量输出测试</title>
</head>
<body>
<p>姓名:{$name}</p>
<p>年龄:{$data.age}</p>
<!-- 调试输出(可配合条件判断) -->
{if condition="app.env('APP_DEBUG')"}
<pre>{:dump($data)}</pre>
{/if}
</body>
</html>
JSON 输出(接口调试)
public function test() {
$data = ['name' => 'Tom', 'age' => 20];
// 输出 JSON(模拟接口返回)
return json($data);
// 或使用 response()
return response($data, 200, ['Content-Type' => 'application/json']);
}
调试技巧
使用 T()
ThinkPHP 提供了 T() 函数,可以输出调试信息到浏览器控制台:
public function test() {
T('开始调试');
// 执行一些操作
T('结束调试');
}
调试模式下的异常处理
use think\exception\ValidateException;
public function test() {
try {
// 业务逻辑
validate([...])->check($data);
} catch (ValidateException $e) {
// 在调试模式下输出详细信息
if (app()->isDebug()) {
dump($e->getMessage());
dump($e->getTrace());
}
return json(['error' => '验证失败']);
}
}
自定义调试方法
// 在公共控制器或基类中定义
protected function debugVars($var, $label = '') {
if (app()->isDebug()) {
echo ($label ? "=== $label ===<br>" : '');
dump($var);
echo "<hr>";
}
}
// 使用
public function test() {
$user = User::find(1);
$this->debugVars($user, '用户信息');
$list = User::all();
$this->debugVars($list, '用户列表');
}
生产环境配置建议
// config/app.php
return [
// 关闭调试模式
'app_debug' => false,
// 调整错误提示
'error_message' => '页面错误!请稍后再试~',
// 关闭 Trace
'app_trace' => false,
// 日志记录级别
'log' => [
'level' => ['error', 'critical'], // 只记录错误级别
],
];
| 调试方法 | 使用场景 | 特点 |
|---|---|---|
dump() |
快速查看变量 | 格式化输出,可查看类型 |
halt() |
输出并终止 | 常用于排查问题 |
Log 类 |
记录调试信息 | 可持久化,适合复杂调试 |
| Trace 面板 | 查看运行详情 | 包含 SQL、性能等信息 |
| 模板输出 | 视图调试 | 结合模板引擎使用 |
| JSON 输出 | 接口调试 | 模拟 API 返回 |
最佳实践:
- 开发环境开启调试模式,使用
dump()、halt()快速调试 - 复杂问题使用日志记录,方便后期分析
- 生产环境务必关闭调试模式,使用错误日志记录
- 调试完成后及时清理调试代码,避免影响性能