第十五章 高级特性

目录
对象
前过滤器
后过滤器
输出过滤器
缓存处理函数
资源

对象

    Smarty允许通过模板存取PHP对象。有两种方法:

    第一种方法可以有比较好的模板语法。它也更加安全,因为注册对象可以被限制于特定的方法或属性。但是,一个注册对象不可以被循环或者在对象数组中赋值。你应该根据你的需要确定使用哪种方法,但是尽可能使用第一种以保证最少使用模板语法。

    如果激活$security,就不能存取任何私有方法或函数(以'_'开头)。如果存在同名的方法和属性,将使用方法。

    如果将可以访问的方法和属性列在一个数组中并作为第三个注册参数传递,你就可以限制可以访问的方法和属性。

    缺省时,通过模板传给对象的参数的传递方法和定制函数获得它们的方法一样。第一个参数是一个关联数组,而第二个参数是Smarty对象。如果你想参数传递的方法是一次一个参数,就象传统对象参数传递一样,将第四个注册参数设置为FALSE

    可选的第五个参数只有当formatTRUE时起作用,包含一个方法列表。该列表中的方法应被视为块。也就是说,这些方法在模板中有关闭它们的标识({foobar->meth2}...{/foobar->meth2})。而且方法的参数和块函数插件的参数有一样的语法。它们有四个参数:$params$content&$smarty&$repeat,而且它们的表现和块函数插件一样。

例子15-1. 使用一个注册(或赋值)的对象

<?php
// 对象声明

class My_Object {
    function 
meth1($params, &$smarty_obj) {
        return 
'this is my meth1';
    }
}

$myobj = new My_Object;

// 注册对象(将是传引用)
$smarty->register_object('foobar',$myobj);

// 如果我们希望限制存取某些方法或属性,将其列出
$smarty->register_object('foobar',$myobj,array('meth1','meth2','prop1'));

// 如果你希望使用传统的对象参数格式,传递false给第四个参数
$smarty->register_object('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'}
the output was {$output}

{* 访问赋值对象 *}
{$myobj->meth1('foo',$bar)}

    参见register_object()assign()