L()函数在TP6中被彻底移除,必须改用lang()助手函数;lang('key')完全兼容原L()用法,支持插值与复数规则,而Lang::get()不推荐使用。

L() 函数在 ThinkPHP 6 中已被弃用,直接调用会报 Call to undefined function L();不是配置问题,是函数本身被移除了——必须改用 lang::get() 或 lang() 助手函数。
为什么 L() 在 TP6 里直接报错
TP6 彻底重构了语言类体系,L() 是 TP3/5 的全局函数,TP6 中语言逻辑全部收归 think\lang\Lang 类管理,不再提供同名函数。即使你手动引入旧版函数文件,也会和容器、事件机制冲突。
- TP5.1 还支持
L()(但已标记@deprecated) - TP6.0+ 完全删除该函数定义,连
function_exists('L')都返回false - 错误不是“没加载语言包”,而是 PHP 根本找不到这个函数符号
如何把 L('key') 快速替换成等效写法
绝大多数场景下,L('key') 可直接替换为 lang('key'),语义一致、参数兼容、支持占位符和复数语法。
-
lang('hello')→ 等价于旧版L('hello') -
lang('user.name', ['name' => '张三'])→ 支持数组插值,和旧版一样 -
lang('item|items', 2)→ 复数规则依然生效 - 模板中
{:lang('hello')}可直接保留,无需改动 - 不要写
Lang::get('key')做替代——它不处理插值、不走复数规则,只是底层裸取值
旧项目升级时容易漏掉的 L() 调用点
除了控制器和模板,这些地方常藏有隐式依赖 L() 的代码,升级后会静默失效:
立即学习“PHP免费学习笔记(深入)”;
- 自定义验证类里的
$this->error = L('validate_error');→ 改成$this->error = lang('validate_error'); - 模型的
getError()返回文案若硬编码了L()→ 必须重写或改用lang() - 第三方扩展(如 RBAC 权限包)若内部调用了
L()→ 需检查其是否已适配 TP6,否则要 fork 后手动替换 - JS 文件里通过
__LANG__注入的变量,如果后端用L()生成 JSON → 必须统一改为lang()或Lang::range()导出
想保留 L() 函数名?可以但不推荐
如果你有大量历史代码无法批量替换,可在 app/common.php 中临时兼容:
if (!function_exists('L')) {
function L($name = null, $value = null) {
if (is_null($name)) {
return \think\Lang::range();
}
if (is_array($name)) {
\think\Lang::set($name);
return;
}
return \think\lang(lang($name, $value));
}
}
注意:这仅模拟基础行为,不支持复数、插值、作用域切换等高级特性;上线前仍建议逐步迁移到 lang() ——真正难适配的从来不是函数名,而是那些散落在钩子、中间件、命令行脚本里的隐式语言调用。



















