对象 {/programmers/advanced-features/.objects}
Smarty 允许通过模板访问 PHP 对象。
注意
当你向模板分配/注册对象时,请确保从模板访问的所有属性和方法仅用于展示目的。通过对象注入应用程序逻辑非常容易,但这会导致难以管理的糟糕设计。请参阅 Smarty 网站的最佳实践部分。
有两种方式可以访问它们。
第一种方法的模板语法更友好。它也更安全,因为可以限制注册的对象只能访问某些方法或属性。然而,一个注册的对象不能在对象数组中循环或分配等。你选择的方法将由你的需求决定,但尽可能使用第一种方法,以将模板语法减至最少。
如果启用了安全性,不能访问任何私有方法或函数(以'__'开头)。如果存在同名的方法和属性,将使用方法。
你可以通过在第三个注册参数中列出它们的数组,来限制可以访问的方法和属性。
默认情况下,通过模板传递给对象的参数,会像自定义函数获取它们那样传递。关联数组作为第一个参数传递,smarty 对象作为第二个。如果你希望参数像传统的对象参数传递那样一次传递一个,将第四个注册参数设置为 FALSE。
可选的第五个参数只在format为 TRUE 时有效,包含应被视为块的方法列表。这意味着这些方法在模板中有一个结束标签({foobar->meth2}...{/foobar->meth2}),并且方法的参数与block-function-plugins的参数具有相同的概要:它们获取四个参数$params、$content、$smarty和&$repeat,并且它们的行为也像 block-function-plugins 一样。
<?php
// 对象
class My_Object {
function meth1($params, $smarty_obj) {
return 'this is my meth1';
}
}
$myobj = new My_Object;
// 注册对象(将以引用的方式)
$smarty->registerObject('foobar',$myobj);
// 如果我们想限制访问某些方法或属性,将它们列出
$smarty->registerObject('foobar',$myobj,array('meth1','meth2','prop1'));
// 如果你想使用传统的对象参数格式,传递一个false布尔值
$smarty->registerObject('foobar',$myobj,null,false);
// 我们也可以分配对象。尽可能使用assign_by_ref。
$smarty->assign_by_ref('myobj', $myobj);
$smarty->display('index.tpl');
?>
这是在index.tpl中如何访问你的对象:
{* 访问我们注册的对象 *}
{foobar->meth1 p1='foo' p2=$bar}
{* 你也可以分配输出 *}
{foobar->meth1 p1='foo' p2=$bar assign='output'}
输出是 {$output}
{* 访问我们分配的对象 *}
{$myobj->meth1('foo',$bar)}
参见 registerObject() 和 assign()。