Skip to content

对象 {/programmers/advanced-features/.objects}

Smarty 允许通过模板访问 PHP 对象

注意

当你向模板分配/注册对象时,请确保从模板访问的所有属性和方法仅用于展示目的。通过对象注入应用程序逻辑非常容易,但这会导致难以管理的糟糕设计。请参阅 Smarty 网站的最佳实践部分。

有两种方式可以访问它们。

  • 一种方式是向模板注册对象,然后使用类似于自定义函数的语法访问它们。

  • 另一种方式是通过assign()将对象分配给模板,并像访问任何其他分配的变量一样访问它们。

第一种方法的模板语法更友好。它也更安全,因为可以限制注册的对象只能访问某些方法或属性。然而,一个注册的对象不能在对象数组中循环或分配等。你选择的方法将由你的需求决定,但尽可能使用第一种方法,以将模板语法减至最少。

如果启用了安全性,不能访问任何私有方法或函数(以'__'开头)。如果存在同名的方法和属性,将使用方法。

你可以通过在第三个注册参数中列出它们的数组,来限制可以访问的方法和属性。

默认情况下,通过模板传递给对象的参数,会像自定义函数获取它们那样传递。关联数组作为第一个参数传递,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()