app/common.php 是唯一推荐位置,必须严格命名为 common.php 并置于 app/ 目录下,不可在子目录或改名;自定义函数须加业务前缀避免冲突;禁止在其中执行耗时逻辑;修改后需运行 composer dump-autoload。

公共函数文件该放哪:app/common.php 是唯一推荐位置
ThinkPHP 6+ 已明确弃用全局自动加载的 extend/ 下函数文件机制,app/common.php 是框架唯一默认识别并自动引入的公共函数入口。放错地方(比如 app/helper.php 或 app/functions.php)会导致函数根本不可用,且无任何报错提示——它只是静默失效。
- 必须严格命名为
common.php,大小写敏感,不能是Common.php或helpers.php - 文件需直接放在
app/目录下,不在子目录(如app/common/)中,否则不会被自动加载 - 若项目已启用多应用模式(
app/multi),每个应用仍共用同一个app/common.php,不支持按应用隔离函数
函数命名冲突怎么破:一律加前缀,别碰 think\ 和 tp\ 命名空间
ThinkPHP 自带大量助手函数(如 input()、config()、dump()),自定义函数一旦重名,轻则覆盖原意,重则引发路由解析失败或配置读取异常——尤其是 url()、request() 这类高频函数。
- 所有自定义函数名必须带业务或项目前缀,例如
my_format_time()、shop_get_sku_list(),禁用format_time()这类裸名 - 不要试图用
function_exists()包裹定义来“安全覆盖”,TP 加载顺序不可控,反而增加调试难度 - 不建议在
common.php中使用use引入命名空间函数,它只支持全局函数;如需封装类方法,请走服务容器或门面
性能敏感场景别乱塞逻辑:common.php 是启动期执行,不是懒加载
common.php 在每次请求初始化时都会被完整解析执行一次,里面任何耗时操作(如读文件、连数据库、调外部 API)都会成为所有请求的固定开销,哪怕该函数后续根本没被调用。
- 禁止在
common.php中写file_get_contents('config.json')或Db::table('sys_config')->find() - 函数体应保持纯声明(
function xxx() { ... }),所有运行时逻辑延迟到函数被真正调用时再执行 - 如果需要预加载共享数据,改用服务容器绑定单例(
bind('cache_config', function () { ... })),而非塞进common.php
调试时找不到函数?检查 Composer 自动加载是否被绕过
常见现象:函数明明定义在 app/common.php,却报 Call to undefined function my_log()。大概率是因为你手动修改了 composer.json 的 autoload 配置,或执行了 composer dump-autoload --no-scripts,导致 ThinkPHP 的自动引入机制被跳过。
- 确认
composer.json中未删除或覆盖"autoload": {"files": ["app/common.php"]}这一默认项(TP 安装器会自动写入) - 修改
common.php后务必运行composer dump-autoload,仅刷新缓存不够,必须重生成 autoload_files.php - 在 CLI 环境下测试时(如
php think run),确保当前工作目录是项目根目录,否则app/common.php路径解析会失败
app/common.php 的路径、命名、加载时机这三处,基本就没大问题。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











