代码之家  ›  专栏  ›  技术社区  ›  Christian Studer delphist

如何在PHP中访问父对象的类变量?

  •  2
  • Christian Studer delphist  · 技术社区  · 16 年前

    类A的一个实例实例化了一些其他对象,例如从类B:

    $foo = new B();
    

    我想从B中的方法访问A的公共类变量。

    除非我遗漏了一些东西,否则唯一的方法就是将当前对象传递给b的实例:

    $foo = new B($this);
    

    这是最佳实践还是有其他方法可以做到这一点?

    4 回复  |  直到 9 年前
        1
  •  2
  •   Paul Dixon    16 年前

    这对我来说很好,我倾向于用一条经验法则:“保持这个的人会理解它吗?”这是一个容易理解的解决方案。

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

        2
  •  1
  •   James McMahon    16 年前

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

    也就是说,我建议您在B中有一个方法将A注册为数据源,或者在A中创建一个方法将B注册为 Observer 以及B中的匹配方法,A用于通知B值更改。

        3
  •  0
  •   Peter Bailey    16 年前

    与保罗所说的类似,如果只有一个a,那么可以将其作为一个单例实现。然后,可以使用setter方法(基本上是再次聚合)将as的实例作为参数传递给构造函数(聚合),或者直接在构造函数(组合)中设置此关系。

    然而,尽管单件是强大的,但是要小心使用组合来实现它们。很高兴您能这样做并去掉一个构造函数参数,但是如果不重写代码,就不可能用其他东西替换。总的来说,我会坚持聚合,即使使用单子

    $foo = new B( A::getInstance() );
    
        4
  •  0
  •   Jet    15 年前
    $foo = new B($this);
    

    很遗憾,这样的代码不符合我的需要。是否有其他方法访问父对象属性?

    我试着解释原因。我们编写一个游戏软件,有些类有非常“不寻常”的依赖关系,并且以不同的方式相互影响。这就是为什么代码有时几乎不受支持,在每一个实例中都没有与父母的链接(有时甚至是来自不同环境的几个父母,即一个小队可能属于战斗和用户等)。

    现在,链接不满足我的原因。当我为客户端生成输出时,我使用一种XML中的序列化对象。在遇到递归引用(比如到父级的链接)之前,它的工作非常好。我可以让它们受到保护,但随后它们就失去了它们的用法,即(虚拟示例)

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

    另一种方法-在每个可序列化类中实现序列化方法,并在序列化程序内部调用它,如下所示:

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

    但这是很多东西要写和支持!有时我动态地为序列化程序生成对象(更少的流量)。

    我甚至想到了一个黑客:教序列化程序忽略某些类中的一些属性)。呵呵。。。坏主意…

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