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

时间:2014-04-29 22:27:59

标签: php oop

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

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

这使我处于两个问题的中间。

  1. 如果我将$Page->template变量保留为公共状态,则可以使用非模板对象的任何位置覆盖该变量。
  2. $Page->template变量设为私有,我无法再通过调用$Page->template->method();来访问它。
  3. 从我的观点来看,唯一的选择是Page类中的包装器方法,例如$Page->templateView();

    我是唯一一个编码的人,所以选项1是可以接受的,因为我不会覆盖它,但我想知道是否有更好的方法。如果只有那些可以公开使用但未公开修改的属性。

    处理此类事物还有其他选择吗?
    我是在想这个还是想念一些东西?

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分:0)

为了封装(为了隐藏Page类的模板属性)你应该

  1. 将该属性设为私有
  2. 添加返回属性值的get-method
  3. 不要将put-method添加到不允许更新属性值
  4. 因此,您将获得一个只读属性。