thinkphp自定义公共函数需按版本区分:tp6仅自动加载app/common.php,tp3.x需配置load_ext_file或import引入;模板中调用须用|语法且函数不能含引用参数。

ThinkPHP 中自定义公共函数不是“配个路径就能用”,而是取决于版本、加载时机和文件位置。TP3.x 和 TP6 的机制完全不同,硬套会报 Call to undefined function 错误。
TP6 的 app/common.php 是唯一自动加载的公共函数入口
TP6 不再扫描 Common 目录下的所有 .php 文件,只认 app/common.php 这一个文件。它在框架启动早期就被 require_once,所以里面定义的函数全局可用。
- 必须放在
app/common.php(不是app/Common/common.php,大小写和路径都错不得) - 函数定义前无需
if (!function_exists('xxx'))—— 因为这个文件只加载一次 - 不能用
return或exit等中断执行的语句,否则整个请求会崩掉 - 示例:
function format_time($ts) { return date('Y-m-d H:i', (int)$ts); }控制器里直接写format_time(time())即可
TP3.1–3.2 用 Common/common.php + LOAD_EXT_FILE 控制加载范围
TP3 默认加载 Common/common.php,但其他函数文件得靠配置显式引入,否则不会进内存。
-
Conf/config.php中设置:'LOAD_EXT_FILE' => 'fc,helper'→ 就会自动加载Common/fc.php和Common/helper.php - 每个扩展文件里仍需自己加
if (!function_exists('xxx')),因为模块级Common/common.php(如Home/Common/common.php)可能被多次包含 - 不推荐把所有函数塞进一个大文件:调试难、热更新慢、容易因命名冲突导致
Cannot redeclare function
模板中调用自定义函数必须走 | 管道语法,且函数不能有引用参数
模板引擎不支持直接写 <?php echo my_func($a); ?>,只能用变量修饰器形式,且函数签名受限。
- 正确写法:
{$data.id|format_time}或{$data.title|substr=0,10,###} - 函数必须返回值,不能修改传入参数(即不能有
&$var形参),否则模板解析会失败或静默忽略 - 如果函数需要多个参数,必须用
###占位原变量,例如:function truncate($str, $len, $suffix = '...') { return mb_substr($str, 0, $len) . $suffix; }模板中写成:{$text|truncate=20,###,'&nbsp;…'} - 注意:模板函数默认禁用部分危险函数(如
system、eval),黑名单由DEFAULT_FILTER配置控制
按需引入(@.one)适合低频、高耦合函数,但要注意作用域隔离
TP3 支持在控制器里用 import('@.one') 或更简洁的 @.one 语法引入单个文件,但它不会让函数进入全局命名空间 —— 只在当前控制器方法内生效。
- 文件
Common/one.php中定义:function less($a, $b) { return $a - 控制器中必须先写:
@.one;(注意分号),再调用less(1, 2) - 该方式无法在模型、视图或其它控制器中复用,也不适用于需要跨层调用的工具函数
- TP6 已移除此语法,强行使用会触发
Parse error: syntax error
真正容易被忽略的是加载顺序和作用域边界:TP6 的 app/common.php 在容器初始化前就载入,所以不能依赖 app() 或任何服务;TP3 的 LOAD_EXT_FILE 在配置加载后、路由解析前执行,因此也不能用 M() 或 D() 实例化模型 —— 这些限制不看源码根本想不到。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











