错误条件下的修饰符

modifiers within false conditions

抱歉,之前有人问过这个问题,但我找不到了。 为什么以下失败

Uncaught --> Smarty Compiler: Syntax error in template "/home/ezms/public_html_subs/dev4/design/backend/templates/index.tpl" on line 31 "{""|foo }" unknown modifier "foo"

{if false} {""|foo} {/if}

我有条件地包含了某些代码,即

{if $x_enabled} {
  function foo() {
    return "hello";
  }
}

我希望如果 smarty IF 条件的计算结果不为真,则不会执行修饰符。我哪里错了?

您应该在 smarty 插件目录中添加 foo 修饰函数 (https://www.smarty.net/docs/en/plugins.modifiers.tpl) 文件将有一个名称 modifier.foo.php 并包含代码:

function smarty_modifier_foo() { return 'hello'; }

然后,您在模板中的代码 {if false} {""|foo} {/if} 将起作用。

Smarty 是一个编译器,使用词法分析器将其代码语法转换为 PHP。然后 Smarty PHP 执行代码。

编译时,会出现无法识别修饰符的错误。如果修饰符被识别,词法分析器会将其转换为真正的函数(基于插件的作用)——例如,foo("")。作为修改器插件,您可以自由地让插件做更多认为必要的工作,即使没有使用对参数的任何操作的结果。

那么…… 编译后的 PHP 代码类似于:

if(false){$smarty_user_functions->foo("");}

如果编译成功,Smarty 就会让 PHP 执行该代码,其中 PHP 使用自己的优化算法将人类可读的脚本转换为 token/opcode/bytecode。如果当 PHP 运行此代码时,它将决定在错误条件下做什么。