在Smarty中调用静态方法,使用变量作为类名

时间:2015-10-13 08:18:14

标签: php static smarty

我想做这样的事情:

{$foo = 'SomeClassName'}
{$foo::someStaticMethod()}

编译模板时,出现错误:Fatal error: Uncaught --> Smarty: Invalid compiled template for ...

编译文件后,在尝试显示模板时,出现此错误:Parse error: syntax error, unexpected '::' (T_PAAMAYIM_NEKUDOTAYIM), expecting ',' or ';' in ...

当我检查已编译的模板时,它包含以下语句:<?php echo $_smarty_tpl->tpl_vars['foo']->value::someStaticMethod();?>,这显然不是有效的PHP语法(目前)。

根据我对最后一个例子here的理解,Smarty应该支持这一点。

我做错了什么,或者这是Smarty中的错误?

1 个答案:

答案 0 :(得分:0)

根据Smarty文档,似乎只支持分配静态函数的返回码。你尝试过像

{assign var=foo value=SomeClassName::someStaticMethod()} 

如果这没有用,我建议您编写自己的插件:http://www.smarty.net/docs/en/plugins.writing.tplhttp://www.smarty.net/docs/en/api.register.plugin.tpl

类似

<?php
$smarty->registerPlugin("function","callStatic", "smarty_function_callStatic");

function smarty_function_callStatic(array $params, Smarty_Internal_Template $template)
{
  if (isset($params['callable']) && is_callable($params['callable'])
  {
    return call_user_func_array($params['callable'], $params);
  }
}

然后使用smarty语法,如:

{callStatic callable='SomeClassName::someStaticMethod()'}

{callStatic callable='SomeClassName::someStaticMethod()' param1='123' param2='123'}

修改

我还测试了你在问题中提到的完全相同的代码,它对我来说效果很好(最新版本来自https://github.com/smarty-php/smarty)。输出为“123”。

我的代码示例如下:

require '../libs/Smarty.class.php';

class DemoClass {
    public static function foobar()
    {
        return '123';
    }
}

$smarty = new Smarty;
$smarty->display('index.tpl');

/**
 * index.tpl
 *
 {$foo = 'DemoClass'}
 {$foo::foobar()}
 */