【问题标题】:Reference and Overwriting引用和覆盖
【发布时间】:2026-01-27 21:45:02
【问题描述】:

我有:

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 框架上工作,我必须在其中处理一些主要类中的许多类,例如引导程序、包装器、模块、适配器等)

【问题讨论】:

    标签: php class frameworks reference


    【解决方案1】:

    是和否...

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

    $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()

    【讨论】:

    • 是的,当然,我希望有 class::factory() 作为方法名。我只是用这个糟糕的名字来清楚地表达我的意思;)谢谢你。
    【解决方案2】:

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

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

    此外,我会尝试摆脱 setter 方法。实际上,它们提供的唯一好处是验证输入。由于这里不是这种情况,我建议您直接分配课程。

    您问“我应该使用引用吗?”。实际上,自 PHP5 以来所有对象都是通过引用传递的。获得它们的精确副本的唯一方法是使用 clone 关键字。

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

    【讨论】: