我有两个类,Page类和Template类。页面有一个与其关联的模板,因此它将template类的对象存储为其属性之一。
这是我的问题。这些caless用于页面模板化。如果我想包含模板文件,我会调用include $Template->view();
。但,由于这个对象是Page对象的一个属性,所以我必须调用include $Page->template->view();
。
这使我夹在两个问题中间。
- 如果我将
$Page->template
变量保留为公共变量,那么它可能会在任何时候被非Template对象覆盖 - 将
$Page->template
变量设为私有变量,我将无法再通过调用$Page->template->method();
来访问它
从我的角度来看,唯一的选择是Page类中的包装方法,例如$Page->templateView();
。
我是唯一一个对此进行编码的人,所以选项1是可以接受的,因为我不会覆盖它,但我想知道是否有更好的方法。如果有可以公开使用但不能公开修改的属性就好了。
处理这种事情还有其他选择吗
我是想多了还是错过了什么?
您可以:
a( 制作一个公共访问器方法并这样调用它:
class Page
{
private $template;
public function template()
{
return $this->template();
}
}
// call it like this
$page_object->template()->method();
b( 如果你不喜欢用"template(("代替"template",你可以利用神奇的方法:
class Page
{
private $mTemplate;
public function __get($name)
{
if ($name == 'template')
return $this->mTemplate;
}
}
// call it like this
$page_object->template->method();
按照封装顺序(为了隐藏Page类的"template"属性(,您应该
- 将财产私有化
- add-get方法,该方法返回属性的值
- 不添加put方法以不允许更新属性值
因此,您将获得一个只读属性。