在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时,他们可以直接询问它。
有关实现这一目标的好方法的任何想法?有没有我可以参考的模式?
答案 0 :(得分:0)
这在理论上是不可能的。任何东西都没有“封闭”对象;在Enclosing
类的实例中,您只需将引用包含在该对象中。对于同一个Enclosed
实例,可能会有很多引用。
您可以在Enclosed
类中声明Enclosing
,但我不确定PHP是否支持内部类。
否则,只需在创建Enclosing
对象时传递对Enclosed
对象的引用,并将其存储在Enclosed
对象的字段中。
答案 1 :(得分:0)
没有办法直接访问“封闭”另一个对象的对象。您需要传递对所包含对象的引用,或者将数据保存在所包含对象中的变量中。