必须放在 application/common.php,因为 ThinkPHP 5 框架启动时硬编码调用 think\App::initCommon() 加载该路径文件,其他位置如模块目录或 extend 下均不会被自动加载,且该文件必须是纯函数定义、无命名空间和 class 包裹。

必须放在 application/common.php,其他位置都不行。
为什么只能是 application/common.php
ThinkPHP 5 的自动加载机制只在应用初始化阶段扫描并引入这个固定路径的文件。框架启动时会执行 think\App::initCommon(),它硬编码读取 APP_PATH . 'common.php'(即 application/common.php)。放错位置(比如 application/index/common.php 或 extend/ 下)函数根本不会被载入,调用时直接报 Call to undefined function。
- 模块级
common.php(如application/index/common.php)只对当前模块控制器生效,且需手动include,不被框架自动识别 -
thinkphp/helper.php是框架内置助手,用户不能改;extend/下的 PHP 文件需额外配置extra_file_list才能加载,属于非常规路径 - 命名空间、
class包裹、static修饰都会导致函数不可见——common.php必须是纯函数定义文件,顶层作用域
common.php 里写函数要注意什么
函数名要全局可访问,不能和系统函数冲突,参数和返回值逻辑要清晰。常见错误是忘记加 if (!function_exists('xxx')) 防重定义,尤其在 CLI 模式下多次加载时容易报错。
- 推荐写法:
if (!function_exists('p')) { function p($data) { var_dump($data); } } - 避免使用
echo或exit类副作用操作,除非明确用于调试(如pd()) - 函数内不要依赖未声明的全局变量或超全局数组(如
$_POST),应通过参数传入 - 模板中使用的函数(如
{$var|my_format})必须接受至少一个参数(即模板变量本身),否则解析失败
模板里怎么调用自定义函数
语法是 {$var|func_name=arg1,arg2,###},其中 ### 占位符代表原变量值插入位置。如果函数只接收一个参数(即模板变量),可以省略 = 和参数部分,直接写 {$var|func_name}。
- 例如:定义了
function substr_cn($str, $start, $length = null) { return mb_substr($str, $start, $length, 'UTF-8'); } - 模板中调用:
{$title|substr_cn=0,10,###}—— 注意###必须显式写出,否则$str会被当成字符串字面量"###" - 错误写法:
{$title|substr_cn(0,10)}或{$title|substr_cn=0,10}(没###,参数无法绑定到变量)
最容易被忽略的是:函数文件路径不能靠“猜”,也不能靠 IDE 自动跳转提示——TP5 不扫描子目录或别名路径。application/common.php 是唯一确定入口,哪怕项目结构看起来“应该”支持其他位置,实际运行时也只认这一个。

















