【问题标题】:Smarty and objects private propertiesSmarty 和对象私有属性
【发布时间】:2013-12-06 10:09:41
【问题描述】:

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

{$object->property}

但是(如果我理解正确的话)这只有在属性可见性为public 时才有可能,否则 Smarty 似乎无法访问它。

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

${object.property}

这不会在 Smarty 模板中发生,因为无法通过这种方式访问​​私有属性。所以我必须使用如下语法:

{$object->getProperty()}

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

【问题讨论】:

  • 我不知道 Smarty,但在 Twig 中 foo.bar 导致它检查 bar 是否是 foo 的索引或属性,如果不是则检查方法 foo::bar()foo::getBar() 自动。如果 Smarty 不这样做……那就不是很聪明。

标签: php smarty


【解决方案1】:

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

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

如果你有你的私人成员的getter和setter,你可以随意改变它,模板什么都不知道。

【讨论】:

  • 这就是为什么我更喜欢保留我的变量private。但是,由于 Smarty 无法访问它们,我该怎么办?我应该在模板中使用{$object->getProperty()} 吗?
  • 是的,我认为最好的解决方案是使用getter {$object->getProperty()}
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-12
  • 1970-01-01
  • 2012-02-10
相关资源
最近更新 更多