tp6 中 application 目录被移除,核心代码改放小写的 app/ 目录;框架代码移至 vendor/topthink/thinkphp/;配置拆分为 config/ 下多个文件,.env 仅作环境变量覆盖;类加载严格遵循 psr-4,需执行 composer dump-autoload。

tp5 的 application 目录在 tp6 里去哪了?
ThinkPHP6 默认不再生成 application 目录,整个项目从「单应用结构」起步,核心应用代码直接放在 app/ 下——注意是小写的 app,不是 tp5 那个大写的 Application。这个目录里默认包含 controller、model、middleware 等子目录,命名空间也按 PSR-4 对齐路径:app\controller\Index 对应 app/controller/Index.php。
- tp5 的
Application 是多应用起点,目录名首字母大写、自带模块划分(如 index、admin)
- tp6 的
app/ 是单应用默认根,若需多应用,必须手动安装扩展:composer require topthink/think-multi-app
- tp5 中
thinkphp/ 框架代码在项目根下;tp6 中框架已完全移至 vendor/topthink/thinkphp/,和业务代码彻底分离
.env 文件能替代所有配置吗?
不能,但它是 tp6 配置体系的“入口开关”。tp6 把原先 tp5 的 config.php 拆成多个文件(app.php、database.php、route.php 等),统一放在 config/ 目录下;而 .env 是一个纯文本环境变量文件,只负责覆盖其中部分字段(比如 DB_HOST、APP_DEBUG)。
-
.env 必须叫这个名字,不能加后缀、不能分环境(如 .env.production 不生效)
- 它只影响被
Env::get() 显式读取的配置项,不会自动映射到所有 config 文件
- 常见错误:改了
.env 但数据库连不上 → 检查 config/database.php 是否用了 env('DB_HOST'),而不是硬编码
- 开发时建议把
.env 加入 .gitignore,避免密码泄露
类自动加载为什么总报 Class not found?
tp6 彻底放弃 tp5 的混合加载机制(自定义 + Composer),只依赖 Composer 的 PSR-4 自动加载规则。这意味着:
- 所有类必须严格遵循命名空间与物理路径一致,比如
app\service\UserService 必须位于 app/service/UserService.php
- tp5 允许控制器方法用下划线命名(
user_list),tp6 要求小驼峰(userList),否则路由匹配失败且不报错,只返回 404
- 新增类后必须执行
composer dump-autoload(开发中可加 -o 参数优化性能)
- tp5 的
extend/ 目录在 tp6 中已被废弃,第三方类库应统一走 vendor/ 或通过 Composer 加载
tp6 的 public/ 和入口文件有什么变化?
tp6 的 public/ 仍是 Web 可访问根目录,但入口文件 index.php 更轻量:它只做两件事——引入 vendor/autoload.php 和启动 think\App。tp5 的入口还承担了常量定义、路径设置等职责。
- tp5 的
index.php 里能看到 define('APP_PATH', <strong>DIR</strong> . '/../application/'); 这类逻辑;tp6 已全部移入框架初始化流程
- tp6 内置了开发服务器:
php think run,端口默认 8000,比配 Apache/Nginx 快得多,但仅限开发——上线必须用真实 Web 服务器
- 静态资源(JS/CSS/IMG)仍放
public/ 下,但模板文件默认不在 public/,而在 app/view/(需手动启用模板引擎:composer require topthink/think-view)
Application 是多应用起点,目录名首字母大写、自带模块划分(如 index、admin)app/ 是单应用默认根,若需多应用,必须手动安装扩展:composer require topthink/think-multi-app
thinkphp/ 框架代码在项目根下;tp6 中框架已完全移至 vendor/topthink/thinkphp/,和业务代码彻底分离.env 文件能替代所有配置吗?
不能,但它是 tp6 配置体系的“入口开关”。tp6 把原先 tp5 的 config.php 拆成多个文件(app.php、database.php、route.php 等),统一放在 config/ 目录下;而 .env 是一个纯文本环境变量文件,只负责覆盖其中部分字段(比如 DB_HOST、APP_DEBUG)。
-
.env必须叫这个名字,不能加后缀、不能分环境(如.env.production不生效) - 它只影响被
Env::get()显式读取的配置项,不会自动映射到所有 config 文件 - 常见错误:改了
.env但数据库连不上 → 检查config/database.php是否用了env('DB_HOST'),而不是硬编码 - 开发时建议把
.env加入.gitignore,避免密码泄露
类自动加载为什么总报 Class not found?
tp6 彻底放弃 tp5 的混合加载机制(自定义 + Composer),只依赖 Composer 的 PSR-4 自动加载规则。这意味着:
- 所有类必须严格遵循命名空间与物理路径一致,比如
app\service\UserService 必须位于 app/service/UserService.php
- tp5 允许控制器方法用下划线命名(
user_list),tp6 要求小驼峰(userList),否则路由匹配失败且不报错,只返回 404
- 新增类后必须执行
composer dump-autoload(开发中可加 -o 参数优化性能)
- tp5 的
extend/ 目录在 tp6 中已被废弃,第三方类库应统一走 vendor/ 或通过 Composer 加载
tp6 的 public/ 和入口文件有什么变化?
tp6 的 public/ 仍是 Web 可访问根目录,但入口文件 index.php 更轻量:它只做两件事——引入 vendor/autoload.php 和启动 think\App。tp5 的入口还承担了常量定义、路径设置等职责。
- tp5 的
index.php 里能看到 define('APP_PATH', <strong>DIR</strong> . '/../application/'); 这类逻辑;tp6 已全部移入框架初始化流程
- tp6 内置了开发服务器:
php think run,端口默认 8000,比配 Apache/Nginx 快得多,但仅限开发——上线必须用真实 Web 服务器
- 静态资源(JS/CSS/IMG)仍放
public/ 下,但模板文件默认不在 public/,而在 app/view/(需手动启用模板引擎:composer require topthink/think-view)
app\service\UserService 必须位于 app/service/UserService.php
user_list),tp6 要求小驼峰(userList),否则路由匹配失败且不报错,只返回 404composer dump-autoload(开发中可加 -o 参数优化性能)extend/ 目录在 tp6 中已被废弃,第三方类库应统一走 vendor/ 或通过 Composer 加载public/ 和入口文件有什么变化?
tp6 的 public/ 仍是 Web 可访问根目录,但入口文件 index.php 更轻量:它只做两件事——引入 vendor/autoload.php 和启动 think\App。tp5 的入口还承担了常量定义、路径设置等职责。
- tp5 的
index.php里能看到define('APP_PATH', <strong>DIR</strong> . '/../application/');这类逻辑;tp6 已全部移入框架初始化流程 - tp6 内置了开发服务器:
php think run,端口默认 8000,比配 Apache/Nginx 快得多,但仅限开发——上线必须用真实 Web 服务器 - 静态资源(JS/CSS/IMG)仍放
public/下,但模板文件默认不在public/,而在app/view/(需手动启用模板引擎:composer require topthink/think-view)
tp6 的目录结构不是“换了个名字”,而是把配置、加载、运行时三者之间的耦合切开了。最容易出问题的地方,往往不是你写了什么,而是你忘了删掉 tp5 时代留下的习惯:比如还在 application/ 下建模块、还在 config.php 里写全局配置、或者以为 .env 能自动切换整套环境配置。











