2008-09-15 109 views
2

A类的实例实例一对夫妇的其他对象的,比方说从B类:如何在PHP中访问父对象的类变量?

$foo = new B(); 

我想从方法来访问内部B.

A的公共类变量,除非我失去了一些东西,要做到这一点的唯一方法是对当前对象传递给B的情况:

$foo = new B($this); 

这是最好的做法还是有另一种方式来做到这一点?

回答

2

对我来说这看起来很好,我倾向于使用“会有人维持这种理解吗?”的经验法则吗?这是一个容易理解的解决方案。

如果只有一个“A”,你可以考虑使用注册表模式,见例如http://www.phppatterns.com/docs/design/the_registry

+0

谢谢。在我的特殊情况下,注册表模式确实适用。 (A类打开多个数据库链接,必须将配置信息传递给B和其他类。) – 2008-09-15 12:24:24

1

我会先检查你是否使用了错误的模式:从你的应用程序逻辑,B应该真的知道A吗?如果B需要了解A,亲子关系似乎不够充分。例如,A可以是孩子,或者A的逻辑的一部分可以进入层次结构中“低于”B的第三个对象(即,不知道B)。

也就是说,我建议你在B中有一个方法来注册A作为数据源,或者在A中创建一个方法来将B注册为Observer和B中的一个匹配方法,A用来通知B的值变化。

0

什么保罗说,如果只有一个A,你可以实现,作为一个单身类似。然后,您可以将A的实例作为参数传递给构造函数(聚合),并使用setter方法(实质上是再次聚合),也可以直接在构造函数(composition)中设置此关系。

然而,虽然单身人士是强大的,但要小心与组成一起实施它们。很高兴认为你可以这样做并且摆脱构造函数的参数,但是它也使得用别的代码替换A而不用代码重写是不可能的。 Peronsally,我会与聚集坚持,即使使用单

$foo = new B(A::getInstance()); 
0
$foo = new B($this); 

这样的代码遗憾的是不符合我的需求。有没有其他的方式来访问父对象的属性?

我会尽力解释原因。我们编写游戏软件,一些课程具有非常“不寻常”的依赖性,并以不同方式相互影响。这就是为什么在每种情况下,没有与父母联系的情况下,代码有时几乎不可支持(有时甚至是来自不同情境的几个父母,即一个小队可能属于战斗和用户等等)。

而现在链接不满足我的原因。当我为客户端生成输出时,我使用XML中的一种序列化对象。它工作得很好,直到遇到像父母的链接那样的递归引用。我可以让他们受到保护,但是随后他们放弃了他们的使用(虚拟实例)

$this->squad->battle->getTeam($tid)->getSquad($sqid)->damageCreature(...); 

另一种方式 - 来实现序列化方法在每一个序列化类并调用它内部串行这样的:

$obj->toXML($node); 
$this->appendChild($node); 

但是这是一个很大的东西,写和支持!有时我会动态生成串行器的对象(流量较少)。

我什至想到一个黑客:“教”串行器忽略某些属性在某些classess))。呃...不好主意...

这是一个长时间的讨论,但相信我,注册表和观察员不适合。还有其他想法吗?