代码之家  ›  专栏  ›  技术社区  ›  Julius F

引用和重写

  •  1
  • Julius F  · 技术社区  · 15 年前

    我有:

    class A{
    
        public $name = 'A';
        public $B;
    
        public function B_into_A($b)
        {
            $this->B = $b;
        }
    }
    
    class B{
    
        public $name = 'B';
        public $A;
    
        public function new_A_into_B($a)
        {
            $this->A = new $a;
        }
    }
    
    $a = new A;
    $b = new B;
    $a->B_into_A($b);
    $b->new_A_into_B('A');
    

    这是在运行时开始时在“主”类中插入另一个类的好方法吗? 我应该使用参考资料吗?

    (背景:我目前在一个MVC框架中工作,在这个框架中,我必须处理一些主要类中的许多类,例如引导程序、包装器、模块、适配器等)。

    2 回复  |  直到 15 年前
        1
  •  2
  •   Galen    15 年前

    是的,也不是。

    您的第一个函数调用很好,我只使用一个更标准的名称:

    $a = new A;
    $b = new B;
    $a->setB($b); // B_into_A is a little bit of a whacky function name
    

    第二次调用时,传递字符串然后创建对象(除非您正在查找某种类型的 factory )如果你想让B拥有A:

    $b->new_A_into_B( new A );
    
    public function new_A_into_B($a)
    {
        $this->A = $a;
    }
    

    再说一次,我不喜欢这个名字……我可能会同意 setA() 那里也有。

        2
  •  1
  •   user206268    15 年前

    传递一个对象而不是它的类名是有意义的,因为这样垃圾收集器就更容易猜测什么时候不再需要它了。

    <?php
    
    class A {
        public $B;
    }
    
    class B {
        public $A;
    }
    
    $a = new A;
    $b = new B;
    
    $a->B = $a;
    $b->A = $b;
    

    此外,我还试图摆脱setter方法。在实践中,它们提供的唯一好处是验证输入。既然这里不是这样,我建议你直接分配课程。

    你问“我应该用推荐信吗?”。实际上,所有对象都是通过引用传递的,因为php5。唯一的方法是使用 克隆 关键字。

    顺便说一下,您不需要在每个对象中存储类名。只需使用get_class()。