thinkphp 5 自定义模板函数必须定义在 application/common.php 中且为裸函数,调用时多参数需用 ### 显式标记原变量位置,中文处理需手动判断首字符,修改后须清除 runtime/template/ 缓存。

ThinkPHP 5 的自定义函数不能靠「导入」来生效,必须直接写进 application/common.php 文件里,否则模板中用 {$var|myFunc} 会报错或静默失败。
自定义函数必须放对位置才能被模板识别
TP5 不支持通过 import、vendor 或配置 extra_file_list 加载模板函数。模板引擎只在固定路径找函数:
-
application/common.php是唯一被自动加载的全局函数文件(注意不是common/目录下的某个 PHP 文件) - 函数不能包裹在命名空间里,也不能是类方法或
static,必须是裸function myFunc($arg) { ... } - 如果用了
use或require引入其他文件,那些文件里的函数模板里依然找不到
模板里调用带参数的函数必须写 ###
常见错误:写了 function myStrReplace($find, $replace, $str),却在模板里写成 {$title|myStrReplace='旧','新'} —— 这样 $str 拿到的是 null,因为没告诉模板“原始变量该插在哪”。
- 正确写法:
{$title|myStrReplace='旧','新',###} -
###必须显式出现,且位置要对应函数最后一个参数 - 多个参数之间用英文逗号分隔,不能有空格:
myTrim=###合法,myTrim = ###会解析失败 - 单参数函数可省略
###,但统一写上更稳妥:{$val|myUcfirst=###}
中文处理别踩 ucfirst 和 ucwords 的坑
ucfirst('你好 world') 返回的还是 你好 world,因为 ucfirst 只识别 ASCII 字母;ucwords('用户中心Settings') 会切成 用户 中心settings,首字母全乱。
- 真要支持中英文混合首字母大写,得手动拆逻辑:
mb_substr($str, 0, 1, 'UTF-8')提取首字符,再用mb_ereg_match('^[\x{4e00}-\x{9fff}]+$', $char, 'u')判断是否为中文 - 中文开头就原样返回;英文开头才用
mb_strtoupper($char, 'UTF-8')+ 剩余部分 - 函数写完必须清缓存:删掉
runtime/template/下所有文件,否则模板仍用旧解析规则
最常被忽略的一点:改了 common.php 后不清理模板缓存,函数看似写了,实则根本没进模板引擎的符号表 —— 这不是 bug,是 TP5 的设计机制。











