A类的实例实例化了几个其他对象,例如来自B类:
$foo = new B();
我想从B中的方法访问A的公共类变量。
除非我遗漏了某些内容,否则唯一的方法是将当前对象传递给B的实例:
$foo = new B($this);
这是最佳做法还是有其他方法可以做到这一点?
答案 0 :(得分:2)
这对我来说很好看,我倾向于使用“有人会保持这种理解吗?”的经验法则。这是一个容易理解的解决方案。
如果只有一个“A”,您可以考虑使用注册表模式,例如参见http://www.phppatterns.com/docs/design/the_registry
答案 1 :(得分:1)
我首先检查你是否使用了错误的模式:从你的应用程序逻辑来看,B应该真的知道A吗?如果B需要了解A,那么亲子关系似乎不够充分。例如,A可以是孩子,或者A的逻辑的一部分可以进入层次结构中“低于”B的第三个对象(即,不知道B)。
那就是说,我建议你在B中有一个方法来注册A作为数据源,或者在A中创建一个方法来将B注册为Observer,并在B中使用A来进行通知的匹配方法B值变化。
答案 2 :(得分:0)
与Paul所说的相似,如果只有一个A,你可以将其作为一个单独实现。然后,您可以使用setter方法(主要是再次聚合)将A的实例作为参数传递给构造函数(聚合),或者可以直接在构造函数(组合)中设置此关系。
然而,虽然单身人士很强大,但要谨慎使用作曲来实施。很高兴认为你可以这样做并摆脱构造函数参数,但它也使得在没有代码重写的情况下用其他东西替换A是不可能的。 Peronsally,我坚持使用聚合,即使使用单例
$foo = new B( A::getInstance() );
答案 3 :(得分:0)
$foo = new B($this);
不幸的是,这样的代码与我的需求不符。有没有其他方法来访问父对象属性?
我会试着解释原因。我们编写游戏软件,有些类具有非常“不寻常”的依赖关系,并以不同的方式相互影响。这就是为什么在没有链接到父母的情况下有时代码有时几乎无法支持(有时甚至是来自不同情境的几个父母,即Squad可能属于Battle和User等......)。
现在链接不能满足我的原因。当我为客户端生成输出时,我在XML中使用了一种序列化对象。它工作非常好,直到它遇到递归引用,如那些到父母的链接。我可以让它们受到保护,但随后它们就会失去它们的用法,即(虚拟例子)
$this->squad->battle->getTeam($tid)->getSquad($sqid)->damageCreature(...);
另一种方法 - 在每个可序列化的类中实现序列化方法,并在串行器中调用它,如下所示:
$obj->toXML($node);
$this->appendChild($node);
但这是很多东西要写和支持!有时候我会动态生成序列化程序的对象(减少流量)。
我甚至考虑过黑客攻击:“教导”序列化程序忽略某些属性中的某些属性))。嗯......糟糕的主意......
这是一个长时间的讨论,但请相信我,注册表和观察者不适合。还有其他想法吗?