tp5.1中不能用require/include手动引入函数文件,因其跳过app::init()初始化流程,导致函数不可见;应使用load('@.xxx')或配置load_ext_file自动加载application/common/下的php文件。

不能用 require 或 include 手动引入,否则大概率报 Call to undefined function xxx() —— 这是 TP5.1 生命周期和自动加载机制决定的,不是权限或路径问题。
为什么 require 会失败
TP5.1 在应用初始化阶段(App::init())统一加载 application/common.php;手动 require 会跳过该流程,导致函数在中间件、钩子、命令行等场景下根本不可见。即使某次“能跑”,也是因缓存或执行顺序巧合,上线后极易崩。
常见错误现象:Call to undefined function getUserName(),尤其在中间件里调用自定义函数时高频出现。
load('@.xxx') 是最稳妥的运行时引入方式
该函数由框架提供,专为动态加载 application/common/ 下的 PHP 文件设计,路径解析稳定,且不破坏初始化顺序。
-
load('@.myfunc')→ 加载application/common/myfunc.php - 必须写成
@.xxx形式,./common/myfunc、common/myfunc或绝对路径均无效 - 文件名严格区分大小写:Linux 下
UserFunc.php≠userfunc.php,推荐全小写命名 - 建议放在控制器方法开头,避免在条件分支中重复调用同一文件(否则触发
Cannot redeclare)
LOAD_EXT_FILE 配置适合全站通用函数
在 application/config.php 中添加配置项,让框架在启动时自动加载指定文件:
'LOAD_EXT_FILE' => 'common,helper,validate'
这会依次加载:application/common/common.php、application/common/helper.php、application/common/validate.php。
- 只支持
application/common/目录下的文件,不支持子目录(如common/utils/xxx.php) - 多个文件用英文逗号分隔,末尾不能有空格
- 若已存在
application/common/common.php,它会被自动加载,无需额外配置 - 不要同时用配置 +
load()加载同一个文件,否则运行时报致命错误
函数文件本身要注意什么
所有函数必须定义在 application/common/ 下的 PHP 文件中,且满足以下约束:
- 不加命名空间,直接用
function xxx() { ... } - 文件末尾禁止写
?>闭合标签,否则 JSON 接口可能报headers already sent - 函数内慎用
$this、Db::、request()等上下文对象——它们不一定已初始化;应通过参数传入依赖 - 建议用
function_exists()包裹定义,防止多模块共用时重复声明:if (!function_exists('getUserName')) { function getUserName($id) { return \think\Db::table('user')->where('id', $id)->value('name'); } }
真正容易被忽略的是:函数文件位置硬编码在框架逻辑里,application/common/ 是唯一合法路径;改配置、换命名空间、挪到 extend/ 或 thinkphp/library/ 都不会生效。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











