特殊访问封闭对象?

时间:2009-09-30 15:15:05

标签: php design-patterns oop

在PHP5.3中,有没有办法让一个对象$封闭,知道它所在的对象$封闭了什么?基本上我想让$ enclosing的一些变量只能被$封闭,而不会特意传递这些变量。

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对象的数组$ schedule。 $ schedule的每个成员必须知道$ window。所以我在Calendar和Schedule之间实现了Observer模式。

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

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

如果$ events中的事件知道他们的附表是谁,并且附表知道其封闭日历是谁,那将会更有效率。然后,当这些对象需要使用$ window时,他们可以直接询问它。

有关实现这一目标的好方法的任何想法?有没有我可以参考的模式?

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

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