Php Smarty对象和私有属性

Php Smarty对象和私有属性,php,smarty,Php,Smarty,Smarty允许在模板中使用以下语法访问对象属性: {$object->property} 但如果我理解正确,这只有在属性可见性为公共时才可能实现,否则Smarty似乎无法访问它 在Java中,我用来创建具有私有属性的对象,我通常使用getter和setter在业务逻辑中读取/写入这些属性。但是,即使我创建了一个具有私有属性的对象,我也可以使用表达式语言在jsp中访问它: ${object.property} 这在Smarty模板中不会发生,因为无法通过这种方式访问私有属性。因此,我必

Smarty允许在模板中使用以下语法访问对象属性:

{$object->property}
但如果我理解正确,这只有在属性可见性为公共时才可能实现,否则Smarty似乎无法访问它

在Java中,我用来创建具有私有属性的对象,我通常使用getter和setter在业务逻辑中读取/写入这些属性。但是,即使我创建了一个具有私有属性的对象,我也可以使用表达式语言在jsp中访问它:

${object.property}
这在Smarty模板中不会发生,因为无法通过这种方式访问私有属性。因此,我必须使用如下语法:

{$object->getProperty()}

为什么呢?为什么Smarty不能像jsp EL那样解决这个问题?

从外部读取和写入对象的私有成员违反了OOP封装原则。如果将类的成员标记为private,则除了类或友元函数中的代码之外,没有人可以访问它

保持尽可能少的公共成员可以减少不同代码模块之间的依赖性,使应用程序更加灵活。如果您可以访问的私有成员,比如您的模型,那么您的模板必须知道模型的内部实现。更改模型将花费您大量的时间,因为您还需要更改模板


若你们有私人成员的getter和setter,你们可以随意更改它,模板将一无所知

我不知道Smarty,但在Twig foo.bar中,它会检查bar是否是foo的索引或属性,如果不是,则自动检查foo::bar和foo::getBar方法。如果Smarty不这么做。。。这不是很聪明,这就是为什么我更喜欢把变量保密的原因。但是,由于Smarty在访问它们时遇到了一些困难,我该怎么办?我应该在模板中使用{$object->getProperty}吗?是的,我认为最好的解决方案是使用getter{$object->getProperty}。