thinkphp模板中需在common.php定义全局函数(如mbucfirst)并用|调用,注意多参数须写###占位符、中文处理需mb_系列函数指定utf-8编码,且修改后须清缓存生效。

ThinkPHP 本身不提供通用的「字符串大小写批量转换」辅助函数,但你可以用原生 PHP 函数直接写,关键是要避开 strtoupper 对中文无效、ucwords 按空格切分等坑,同时确保模板中能像 {$name|myUcfirst} 这样调用。
自定义函数必须放对位置才能被模板识别
ThinkPHP 5/6/7 都要求自定义模板函数必须定义在 app/common.php(TP6/7)或 application/common.php(TP5)里,且不能包裹在命名空间或类中。函数名要全局可访问,不能是 static 或 private。
- TP5 和 TP6 兼容写法:直接在
common.php里写function myUcfirst($str) { return ucfirst($str); } - TP7 推荐改用
app/bootstrap.php注册,但模板函数仍需放在common.php,否则|语法找不到 - 别把函数写进控制器或模型——模板解析器根本不会去那里找
中文首字母大写不能只靠 ucfirst
ucfirst 只处理 ASCII 字符,遇到中文会原样返回,比如 ucfirst('你好 world') 得到的是「你好 world」,不是「你好 World」。真要支持中英文混合场景,得自己拆逻辑:
- 先用
mb_substr($str, 0, 1, 'UTF-8')提取首字符 - 用
mb_ereg_match('^[\x{4e00}-\x{9fff}]+$', $char, 'u')判断是否为中文(或更轻量地用mb_strlen($char, 'UTF-8') === 1 && ord($char) >= 128) - 如果是中文,直接返回原字符串;如果是英文字母开头,再调
mb_strtoupper($char, 'UTF-8')+ 剩余部分 - 别用
ucwords处理带中文的标题——它按空白切分,遇到「用户中心Settings」就崩了
模板里调用时参数传递容易漏掉 ###
ThinkPHP 模板引擎规定:自定义函数带参数时,必须显式写出占位符 ###,否则参数传不进去。比如你写了 function myStrReplace($find, $replace, $str),模板里必须写成:
{$title|myStrReplace='旧','新',###}
而不是:
{$title|myStrReplace='旧','新'}
- 少一个
###,函数收不到原始变量值,$str是 null - 多个参数之间用英文逗号,不能有空格,
myUcfirst=###是合法的,myUcfirst = ###会解析失败 - 如果函数只接受一个参数(如
myTrim($str)),模板里写{$val|myTrim}或{$val|myTrim=###}都行,后者更统一
大小写转换函数建议加 mb_ 前缀并指定编码
哪怕你确定项目全用 UTF-8,也别省略 mb_ 系列函数的 'UTF-8' 参数。PHP 默认 locale 可能是 C,mb_strtoupper('café', 'UTF-8') 能正确转出「CAFÉ」,而裸调 strtoupper('café') 得到「CAFé」——重音符号丢了。
- 推荐封装:
function mbUcfirst($str) { return mb_strtoupper(mb_substr($str, 0, 1, 'UTF-8'), 'UTF-8') . mb_substr($str, 1, null, 'UTF-8'); } - 别用
setlocale(LC_CTYPE, 'zh_CN.UTF-8')试图修复strtoupper——它对多字节字符无效,且可能污染其他模块 - TP6.1+ 的
json()辅助函数已默认带JSON_UNESCAPED_UNICODE,但字符串函数没这种待遇,得自己兜底
最常被忽略的是:函数定义后必须重启 Web 服务器或清空 runtime/cache,否则模板里还是报「function not found」——ThinkPHP 的模板编译缓存会固化旧的函数列表,不是改完 common.php 就立刻生效。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











