thinkphp 5.x 自定义函数文件必须通过框架自动加载机制引入,手动 require/include 会破坏初始化顺序导致函数未定义;正确方式是将函数文件置于 application/common/ 目录下,通过配置 load_ext_file、load('@.xxx') 或默认加载 common.php 三种官方支持方式引入。

ThinkPHP 5.x 中自定义函数文件(如 common.php 或其他扩展函数文件)不能靠 include 或 require 手动引入,必须走框架的自动加载机制,否则在控制器或模型里直接调用会报「函数未定义」。
为什么直接 require 不行
TP5 的生命周期中,common.php 类函数文件是在应用初始化阶段由 App::init() 统一加载的;手动 include 会破坏加载顺序,且可能在路由解析、中间件执行前就提前执行,导致依赖未就绪、配置未读取、甚至重复加载报错。
- 常见错误现象:
Call to undefined function xxx(),尤其在中间件、钩子或命令行场景下高频出现 - 即使某次“看起来能跑”,也是因缓存或巧合,上线后极易失效
-
LOAD_EXT_FILE配置项只对Common/目录下的 PHP 文件生效,不支持子目录或任意路径
正确引入方式:三种官方支持路径
所有方式都要求函数文件放在 application/common/ 目录下(非 thinkphp/library/think/ 或 extend/),文件内用 function 声明,不加命名空间。
- 方式一:配置自动加载(推荐)
在application/config.php中添加:'LOAD_EXT_FILE' => 'common,myfunc'
表示同时加载application/common/common.php和application/common/myfunc.php;多个用英文逗号分隔 - 方式二:运行时动态加载(仅限当前请求)
在控制器方法开头写:load('@.myfunc');注意@表示当前应用的common/目录,不能写成./common/myfunc或绝对路径 - 方式三:项目级默认加载(隐式)
只要存在application/common/common.php,TP5 会自动加载它——无需任何配置,也不需要LOAD_EXT_FILE;这是唯一一个“开箱即用”的函数文件
容易踩的坑:路径、命名与冲突
函数文件名和调用方式强绑定,大小写、后缀、位置错一个就失败。
-
load('@.UserFunc')会尝试加载application/common/UserFunc.php,但 Windows 下可能“碰巧”成功,Linux 下严格区分大小写 → 必须小写命名 - 文件末尾不能有
?>闭合标签,否则输出空白字符,导致 JSON 返回异常或 headers already sent 错误 - 多个模块共用同一函数文件时,不要在函数里直接使用
$this或Db::等上下文对象,应通过参数传入,避免耦合和作用域混乱 - 若同时用配置加载 + 手动
load()同一文件,会触发 PHPCannot redeclare致命错误——二者选其一,不可混用
最稳妥的做法是:把通用函数全塞进 application/common/common.php,靠自动加载兜底;临时性、模块专用函数再用 load('@.xxx') 按需加载。别碰 thinkphp/common/function.php,那是框架内部用的,改了升级就丢。











