Smarty假是真的吗?

时间:2013-09-08 21:52:01

标签: smarty

我有一个聪明的功能:

function smarty_function_false_() {
    return false;
}

然后,如果我这样做:

{if false_} false YES?? {else} false no {/if} <br>
{if not false_} not false yes {else} not false NO??? {/if}

它可以逃避:

false YES??
not false NO???

我很聪明,为什么会这样?

1 个答案:

答案 0 :(得分:2)

Smarty表达式{if false_}不评估任何函数。它相当于{if 'false_'},它与PHP表达式if ( 'false_' )完全相同。 (顺便说一句,除非你运行if ( false_ ),否则PHP中的define('false_', ...)也意味着相同的事情。)

在PHP的“类型杂耍”规则下,只要不是空字符串(true),解释为布尔值的字符串就是''。因此{if false_}相当于{if true}

Smarty "template function"仅设计为自己调用,并返回输出到模板的内容,例如{false_}

{if}条件内进行回调的最简单方法是定义"modifier"而不是“函数”。虽然修饰符总是至少给出一个参数,但可以简单地忽略它,因此您可以拥有以下内容:

function smarty_modifier_false_($whatever) {
    return false;
}

然后在Smarty中传递任何旧字符串作为修饰符的左侧:

{if ''|false_} false_ is true!? {else} false_ is false. How reassuring. {/if}

替代方法:

  • 在模板中设置安全设置,以便您可以编写{if false_()},因为false_是直接在模板中允许的PHP函数。 (请参阅documentation on {if}链接到the details of Securityblock function。)
  • 注册{{3}}。这些写起来有点棘手,但如果更换,可以让你拥有自己的自定义,例如{if_false_} This text never appears {/if_false_}