2015-10-13 60 views
1

我想要做這樣的事情:在調用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中的錯誤?

回答

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); 
    } 
} 

其中在智者的語法,然後使用如:

{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()} 
*/ 
+0

'{分配VAR =欄值= SomeClassName :: someStaticMethod()}'正常工作。使用變量作爲類名時會出現問題。分配返回值時也是如此:'{assign var = foo value =「SomeClassName」} {assign var = bar value = $ foo :: someStaticMethod()}'會產生相同的錯誤。製作插件是一個很好的解決方法。謝謝!但是,它不是在Smarty中的錯誤還是在文檔中的錯誤? –

+0

我正在使用Smarty的舊版本。更新到最新版本修復了這個問題:) –

相關問題