_eq 和 lt 是 ThinkPHP 模板引擎自定义的比较标签,仅在 {if}{/if} 等模板语法中生效,非 PHP 或 JavaScript 运算符。

ThinkPHP 模板里 _eq 和 lt 是什么?
它们不是 PHP 运算符,也不是 JavaScript 表达式,而是 ThinkPHP 模板引擎(think\template\driver\Think)自定义的比较标签,只在 {if}{/if} 等模板语法中生效。直接写 == 或 会报错或被忽略。
常见错误现象:{if $a == $b} 不生效、{if $status 被原样输出、页面空白或报 <code>Parse error: syntax error —— 因为模板解析器根本不认识这些符号。
-
_eq对应相等判断(===语义,但实际是==比较) -
lt对应“小于”(),还有 <code>gt(大于)、elt(小于等于)、egt(大于等于) - 所有比较标签都要求显式写出左右操作数,不能嵌套表达式,比如
{if $a + 1 _eq $b}是非法的
怎么正确替换 == 和 为 <code>_eq 与 lt
替换不是简单字符替换,要按模板语法重写整个条件结构。ThinkPHP 的比较标签必须作为属性出现在 {if} 标签内,且左右值需用引号包裹(字符串)或不加引号(变量/数字)。
使用场景:判断状态码、权限等级、时间戳范围、枚举值等静态或变量比较。
立即学习“PHP免费学习笔记(深入)”;
- 错误写法:
{if $user.level == 5}→ 模板无法识别 - 正确写法:
{if condition="$user.level _eq 5"} - 字符串比较:
{if condition="$user.status _eq 'active'"}(注意单引号包裹) - 小于判断:
{if condition="$order.amount lt 100"},不能写成{if $order.amount - 支持变量间比较:
{if condition="$a lt $b"},但两边不能是函数调用或复杂表达式
condition 属性和直接写标签的区别?
ThinkPHP 5.1+ 推荐统一用 condition 属性,而不是老版本的 {if $a _eq $b} 简写形式。后者在部分驱动或开启严格模式时可能失效。
参数差异直接影响兼容性:
- 简写形式(如
{if $a _eq 1})依赖模板编译器自动补全,5.0 兼容,5.1+ 默认关闭或警告 -
condition是显式声明,更稳定,且支持逻辑组合:{if condition="$a _eq 1 and $b gt 10"} - 注意:
and/or是模板关键字,不是 PHP 的&&/||;大小写敏感,必须小写 - 空格是分隔符,
$a_eq1或$a_eq 1(多空格)都会导致解析失败
容易被忽略的坑:类型隐式转换和 null 处理
ThinkPHP 模板比较标签底层调用的是 PHP 的 ==,不是 ===,所以 "1" 和 1 会被判为相等。这在处理数据库返回的字符串型 ID 或状态时极易出错。
性能影响不大,但逻辑风险高:
-
{if condition="$id _eq '123'"}和{if condition="$id _eq 123"}在多数情况下结果一样,但如果$id是null或空字符串,行为可能不一致 -
lt遇到字符串会尝试转数字,"10abc"→10,"abc10"→0,容易误判 - 安全建议:后端尽量保证传入模板的变量类型明确;必要时在控制器里做一次
(int)$status转换再赋值 - 调试技巧:在模板里加
{dump($status)}查看实际值和类型,比猜更可靠
最麻烦的不是语法写错,而是你以为它在做严格比较,其实它在松散比较——这点不盯住,线上就容易漏掉边界 case。











