ThinkPHP 5 不再自动加载 app/common.php,需通过 config/app.php 中的 'extra_file' 配置项显式声明,如 'extra_file' => [app_path() . 'common.php'],且函数内不可依赖容器对象。

ThinkPHP 5 中,common.php 不再像 TP3.2 那样默认自动加载 —— 这是开发者最容易踩坑的地方。如果你在 app/common.php 里定义了函数或常量,直接在控制器里调用会报 Call to undefined function 错误。
TP5 的 common.php 默认不加载
TP5 废弃了 TP3.x 的“公共模块自动载入”机制。官方只保证 PSR-4 类自动加载,而函数/常量文件需显式声明或手动引入。
-
app/common.php文件存在,但框架启动时不会自动include它 - 即使你把它放在
app/根目录、命名正确,也不会生效 - 错误现象:控制器中调用自定义函数如
my_log(),直接报Call to undefined function my_log() - 原因:TP5 的
Loader::register()只处理类映射(PSR-4 / classmap),不扫描或执行任意 PHP 文件
正确方式:用 extra_file 配置项加载
TP5 支持通过配置项 extra_file 声明需提前加载的函数文件,它会在应用初始化早期被 require_once 执行。
- 在
config/app.php中添加:'extra_file' => [app_path() . 'common.php']
- 路径必须是绝对路径,推荐用
app_path()动态拼接,避免硬编码 - 可同时加载多个文件,例如:
'extra_file' => [app_path() . 'common.php', app_path() . 'helper.php']
- 注意:该配置仅对入口应用有效;若使用多应用模式(如
app/admin),需在对应子应用的config/app.php中单独配置
模块级公共函数怎么处理?
TP5 没有“模块 Common 目录自动加载”概念。所谓 app/index/common.php 或 app/index/common/function.php,框架完全无视。
- 如果你坚持按模块组织函数,只能手动
require:require app_path('index') . 'common/function.php'; - 更合理的方式是封装成服务类或 Facade,走 PSR-4 自动加载,而不是依赖函数文件
- 临时性加载(比如只在某个控制器方法里用)可用
load(),但注意:
–load('index.common.function')是无效的(TP5 已移除该函数)
– TP5 中load()仅用于模板标签或行为扩展,不支持函数文件加载
最易被忽略的一点:TP5 的 extra_file 加载时机在容器注册之前,所以里面不能调用 think\Container::get() 或任何依赖注入对象;所有函数必须是纯逻辑、无框架上下文依赖的。

















