为什么这个Smarty if语句总是评估为真?

时间:2014-10-31 19:01:58

标签: php smarty smarty2

此:

{1234|count_characters}

输出:

4

好。但是这个:

{if 12345|count_characters == 4}
    it's 4
{/if}

输出it's 4。上面的if语句应该明显地评估为false。为什么总是评价为真?

count_characters smarty修饰符只显示字符串或数字中的字符数:

http://www.smarty.net/docsv2/en/language.modifier.count.characters.tpl

3 个答案:

答案 0 :(得分:0)

因为{x|y}语法是echo y(x)的智能短代码,其中echo很重要

但是,{if y|x ==4 }相当于在or上执行按位|x)而y12345|count_characters为真,因为{ {1}}是正确的,即使12345将作为常量进行测试,如果常量不存在,那么作为字符串文字,同时抛出通知),将该操作的结果与{{1 (true == 4 with loose-typing),然后如果是true,等等

答案 1 :(得分:0)

Smarty不是一种编程语言;它是一种模板化标记语言。您已采用输出过滤器并尝试将其用作条件中的通用功能。那不行。

你应该在PHP脚本中保留这样的逻辑。

答案 2 :(得分:0)

这里的问题是你如何使用它。

如果在PHP中,则指定此var:

 $smarty->assign('var',12345);

并使用此代码(如果要确保其正常工作,请使用此代码):

{if $var|count_characters == 4}
    it's 4
{elseif $var|count_characters == 5}
    it's 5
{/if}

您将获得输出it's 5 - 应该是。

如果你没有在PHP中分配任何东西,而是在Smarty中分配它,如下面的代码所示:

{assign var="var" value="12345"}

{if $var|count_characters == 4}
    it's 4
{elseif $var|count_characters == 5}
    it's 5
{/if}

你会得到it's 5 - 应该是。

正如@MarkBaker在你使用12345|count_characters时提到的那样,代码是按位运算符计算的,这里的函数count_characters实际上不是函数 - 它从未启动过,你可以在这里写你想要的任何东西,例如:

{if 12345|count_charact87172368716832ers == 4}
    it's 4
{/if}

即使显然没有it's 4修饰符,也会得到count_charact87172368716832ers

为了让它按照您的意愿工作,您应该在PHP中分配变量(如我在第一个代码中所示)或在Smarty中分配变量(如我在第二个代码中所示)或在字符串上使用count_characters修饰符不在int:

{if '12345'|count_characters == 4}
    it's 4
{elseif '12345'|count_characters == 5}
    it's 5
{/if}

此代码将按预期工作 - 您将获得it's 5