我有一个聪明的功能:
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???
我很聪明,为什么会这样?
答案 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 Security的block function。){if_false_} This text never appears {/if_false_}
。