【问题标题】:How can I handle method calls to an object that is a private property of another object?如何处理对作为另一个对象的私有属性的对象的方法调用?
【发布时间】:2014-04-29 22:27:59
【问题描述】:

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

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

这让我陷入了两个问题。

  1. 如果我将 $Page->template 变量设为公开,它可能会在任何时候被非模板对象覆盖。
  2. $Page->template 变量设为私有,我无法再通过调用$Page->template->method(); 来访问它。

在我看来,唯一的选择是Page类中的包装方法,例如$Page->templateView();

我是唯一一个对此进行编码的人,所以选项 1 是可以接受的,因为我根本不会覆盖它,但我想知道是否有更好的方法。要是有可以公开使用但不能公开修改的属性就好了。

还有其他选择来处理这类事情吗?
我是不是想多了还是错过了什么?

【问题讨论】:

  • 什么是$Page->template?只是一个字符串,引用文件名,比如/my/code/template/dashboard.html?
  • @dognose $Page->template 是 Template 类的对象。该类包含有关模板的各种信息。
  • 模板是视图的一部分,而不是相反 ;-)
  • @Jack View 是我为保存输出的文件决定的任意术语。每个模板都有它的视图,这是该模板的实际 HTML,然后是一个脚本文件,以防该模板需要包含任何依赖项等。只是尝试制作一个简单的小模板系统并将输出与实际逻辑分开。

标签: php oop


【解决方案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();

【讨论】:

  • 我考虑了 __get() 方法,无法下定决心。然而,很好的例子。第一个选项非常简单,但我什至没有想到。我应该想到的。谢谢你提醒我不要再想太多了!感谢您的回复。
【解决方案2】:

按照封装顺序(为了隐藏 Page 类的“模板”属性),您应该

  1. 将属性设为私有
  2. 添加返回属性值的get方法
  3. 不要添加 put-method 不允许更新属性值

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

【讨论】:

  • 感谢您的回复。太糟糕了,没有实际的只读属性功能。这将是一个很好的补充。但是,在这种情况下,我需要一个 put 方法,但希望避免在每次需要使用 Template 方法时调用 get 方法。但是,看起来这就是我必须要做的。再次感谢!
  • 我认为可以通过公共方法访问私有属性。只需创建一个返回属性的方法并像这样调用: $Page->getTemplate()->methodOfTemplate();此外,它允许在 getTemplate 调用上传递一些参数,例如在返回模板属性之前自定义一些东西
  • 我同意你的看法。我只是在想这个问题。我想像访问公共属性一样访问模板,但防止它被修改为私有的。最后,get 方法就足够了。正如你所展示的。还有关于将参数传递给 getTemplate() 的好处,这是我没有考虑过的一个好处。感谢您的回复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-08
  • 2010-09-11
  • 1970-01-01
  • 2022-12-09
  • 1970-01-01
  • 2023-03-26
相关资源
最近更新 更多