如何处理对另一个对象的私有属性对象的方法调用


How can I handle method calls to an object that is a private property of another object?

我有两个类,Page类和Template类。页面有一个与其关联的模板,因此它将template类的对象存储为其属性之一。

这是我的问题。这些caless用于页面模板化。如果我想包含模板文件,我会调用include $Template->view();。但,由于这个对象是Page对象的一个属性,所以我必须调用include $Page->template->view();

这使我夹在两个问题中间。

  1. 如果我将$Page->template变量保留为公共变量,那么它可能会在任何时候被非Template对象覆盖
  2. $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"属性(,您应该

  1. 将财产私有化
  2. add-get方法,该方法返回属性的值
  3. 不添加put方法以不允许更新属性值

因此,您将获得一个只读属性。