tp5不支持模块级common.php自动加载,需在模块config.php中手动require;application/common.php最早加载,适合通用函数,模块common.php须显式引入且避免依赖未初始化对象。

TP5 的 common.php 不支持按模块自动加载
ThinkPHP5 默认只在 application/common.php 加载一次全局函数文件,它不识别模块上下文,也不会为 api 模块或 admin 模块单独加载对应目录下的 common.php。你写在 application/api/common.php 里的函数,框架启动时根本不会执行——除非你手动引入。
模块级函数文件得靠 think\Loader::addNamespace() + 手动 require
TP5 没有内置“模块函数自动加载”机制,但你可以用以下方式模拟:
- 在模块的
config.php中(如application/api/config.php),加一行:require __DIR__ . '/common.php'; - 确保该
common.php文件里只定义函数,不依赖 $this 或控制器上下文 - 如果函数需要命名空间隔离(比如避免和 index 模块同名函数冲突),可手动注册命名空间:
think\Loader::addNamespace('api', APP_PATH . 'api');,再把函数封装成api\common\helper()这类静态调用形式 - 别在
common.php里调用app('request')或input()——此时应用实例可能还没初始化完成,会报错
application/common.php 和模块 common.php 的加载时机差异
入口文件执行顺序是:autoload.php → application/common.php → 框架初始化 → 路由匹配 → 模块加载 → 控制器实例化。这意味着:
-
application/common.php总是最早加载,适合放通用工具函数(如format_bytes()) - 模块
common.php必须在模块配置加载后、控制器运行前引入,否则函数不可见;推荐位置是模块的config.php底部(不是route.php或tags.php) - 如果你用
define('BIND_MODULE', 'api')强制绑定模块,application/api/config.php会被加载,但它的common.php仍需显式require
别把逻辑塞进函数文件,优先用服务类或助手类
硬塞一堆全局函数到 common.php 容易导致命名污染、调试困难、无法 DI 注入。更稳妥的做法是:
- 每个模块下建
service/目录,放ApiHelper.php、AdminUtils.php等类,用use app\api\service\ApiHelper;显式调用 - 函数文件只保留极简、无状态、纯计算型内容(如
is_mobile()、uuid()) - 若必须跨模块复用,统一提至
extend/目录,并用 Composer autoload 配置自动加载,而不是靠 require 链
模块函数不是“配个路径就能自动生效”的功能,它本质是 PHP 文件加载顺序问题——搞清 require 在哪执行、执行时哪些对象已可用,比纠结“怎么分模块”更重要。











