【问题标题】:Special access to enclosing object?对封闭对象的特殊访问?
【发布时间】:2009-09-30 15:15:05
【问题描述】:

在 PHP5.3 中有没有办法让一个对象 $enclose 知道它在哪个对象 $enclosure 中?本质上,我想让 $enclosure 的一些变量只能由 $enclosed 访问,而无需专门传入这些变量。

class Enclosing {
  private $enclosed;//Enclosed object
  private $othervar;

  function __construct($a,$b){
     $this->othervar=$a;
     $this->enclosed= new Enclosed($b);
  }

}

class Enclosed {
  private $myvar;

  function __construct($a){
    $this->myvar=$a;
  }

  function where_am_i() {//get reference to Enclosing object
    //????
  }
}

背景:

我正在开发一个可以显示多个日程表的日历,这些日程表有多个可能重复发生的事件。我正在使用 PHP 的 DateTime、DateInterval 和 DatePeriod 对象进行日期处理(尽管它们有其他缺点,但它们使处理时区和重复更容易)。目前我的设计是这样的:

Calendar 对象有一个名为 $window 的 DatePeriod,其中包含所有显示日期。例如1957 年 5 月。

Calendar 也有一个由 Schedule 对象组成的数组 $schedules。 $schedules 的每个成员都必须知道 $window。所以我在 Calendar 和 Schedule 之间实现了观察者模式。

类似地,每个 Schedule 都有一个事件数组 $events,因为它们可能是重复的,所以也必须知道 $window。所以我在 Schedule 和 Event 之间实现了观察者模式。

所有这一切意味着我每次更改 $window 时都会将其复制到多个其他对象。

如果$events 中的Events 知道它们的封闭Schedule 是谁并且Schedule 知道它封闭的Calendar 是谁,那么效率会高得多。然后,当这些对象需要使用 $window 时,他们可以请求它。

对实现这一目标的好方法有什么想法吗?有什么模式可以参考吗?

【问题讨论】:

    标签: php design-patterns oop


    【解决方案1】:

    这在理论上是不可能的。对象根本没有“封闭”在任何东西中;在Enclosing 类的实例中,您只需包含对该对象的引用。可能到处都有对同一个 Enclosed 实例的许多引用。

    您也许可以在 Enclosing 类中声明 Enclosed,但我不确定 PHP 是否支持内部类。

    否则,只需在创建Enclosed 对象时传递对Enclosing 对象的引用,并将其存储在Enclosed 对象的字段中。

    【讨论】:

    • 我感觉我在寻找魔法。但我想也许我的 $enclosed 可以检查(通过反射?) $enclosure 的所有实例并找到包含自身的实例。
    【解决方案2】:

    没有办法直接访问“封闭”另一个对象的对象。您要么需要传递对封闭对象的引用,要么将数据保存在封闭对象的变量中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-13
      • 1970-01-01
      • 2012-10-08
      相关资源
      最近更新 更多