对象

Smarty可以在模板内使用PHP的 对象

Note

当你赋值/注册一个对象到模板使用时,请确保在模板内使用的属性和方法都是仅为了显示。要通过对象在模板中嵌入应用逻辑是很容易的事情,但是这样会导致较差的设计而且难以管理。请参见Smarty网站上最佳实践的文章。

这里有两个方法来使用对象:

  • 第一个方法是注册对象到模板中,然后按自定义函数相似的方法来使用。

  • 另一个方法是通过assign()将对象赋值给模板, 这种方法对象用起来比较像其他的赋值变量。

第一种方法看起来语法结构更好。而且也更安全,因为注册对象需要限定其方法或者变量的使用。 然而, 注册对象不能进行循环,或者赋值到对象数组,等等。 请根据你的需要来选择用哪种方法,但是首先尽可能保证模板语法的简洁。

如果开启了安全机制,私有方法和函数都不能使用(以'_'开头)。如果有相同名称的方法或属性,那么该方法将会被使用。

你可以通过将方法或属性列在注册函数的第三个数组参数内,来对它们进行限定。

默认情况下,传递参数给对象的方式和传递给自定义函数的方式一样。关联数组作为第一个参数,第二个参数是Smarty对象。如果你需要一次一个地传递参数,就像传统类的参数传递一样,那么就设置第四个参数为FALSE

第五个参数是可选的,仅在formatTRUE的时候生效,而且包含了一个方法的列表,需要按区块的方式使用。意味着这些方法在模板内有个关闭的标签(如:{foobar->meth2}…{/foobar->meth2})而且它们的参数必须按 区块插件函数一样: 它们有四个参数: $params, $content, $smarty&$repeat 而且它们有着和区块插件函数相同的行为。


Example 17.9. 注册或赋值一个对象

  1. <?php
  2. // 类定义
  3.  
  4. class My_Object {
  5. function meth1($params, $smarty_obj) {
  6. return 'this is my meth1';
  7. }
  8. }
  9.  
  10. // 注册对象(引用传递)
  11. $smarty->registerObject('foobar',$myobj);
  12.  
  13. // 列出我们需要限定的部分方法和属性
  14. $smarty->registerObject('foobar',$myobj,array('meth1','meth2','prop1'));
  15.  
  16. // 如果你需要用传统的对象参数格式,设置第四个参数为false
  17. $smarty->registerObject('foobar',$myobj,null,false);
  18.  
  19. // 还可以用assign_by_ref将对象赋值给模板
  20. $smarty->assign_by_ref('myobj', $myobj);
  21.  
  22. $smarty->display('index.tpl');
  23. ?>
  24.  

然后在index.tpl内使用对象:

  1. {* 访问注册的对象 *}
  2. {foobar->meth1 p1='foo' p2=$bar}
  3.  
  4. {* 同样可以赋值给output *}
  5. {foobar->meth1 p1='foo' p2=$bar assign='output'}
  6. the output was {$output}
  7.  
  8. {* 访问赋值的对象 *}
  9. {$myobj->meth1('foo',$bar)}
  10.  

参见 registerObject()assign().

原文: https://www.smarty.net/docs/zh_CN/advanced.features.objects.tpl