如何解决PHP中的钻石问题?

如何解决PHP中的钻石问题?,php,inheritance,diamond-problem,Php,Inheritance,Diamond Problem,我一直在寻找钻石问题的解决方案,但我找到的唯一一个解决方案是在我的案例中无法使用的,所以我在这里询问是否有人有其他解决方案 我有一个基类Controller(我不能更改这个类),有两个子类SecurityController和DevController。这些子类中的每一个子类都引入了方法,这些方法也使用基类中的方法。然后我有了最后一个类ApplicationController,理想情况下,它将扩展SecurityController和DevController。当然,这在PHP中是不可能的(仅

我一直在寻找钻石问题的解决方案,但我找到的唯一一个解决方案是在我的案例中无法使用的,所以我在这里询问是否有人有其他解决方案

我有一个基类
Controller
(我不能更改这个类),有两个子类
SecurityController
DevController
。这些子类中的每一个子类都引入了方法,这些方法也使用基类中的方法。然后我有了最后一个类
ApplicationController
,理想情况下,它将扩展
SecurityController
DevController
。当然,这在PHP中是不可能的(仅限于单一继承)

所以我的问题变成了——解决这个问题的最佳方法是什么?我遇到了traits,但后来意识到这不起作用,因为这两个子类(我认为可能适合traits)都需要扩展
Controller
来访问其中的方法。我能看到的唯一其他选择是强制
SecurityController
扩展
DevController
(反之亦然)。虽然这是可行的,但并不理想,因为这两个类来自不同的模块,我希望创建一个插件,并按原样使用

关于代码的审查看起来很有希望。不过,另一种选择可能会很好——我觉得在尝试改进代码时可能会引入错误

注意解决方案

被接受的答案仍然是我找到的解决这个问题的最好方法。然而,在这种情况下,我能够使用特征。我在
SecurityController
中有一个名为
beforecutetrait($controller,$dispatcher)
的方法,将其更改为
beforecutetrait($controller,$dispatcher)
,并使
SecurityController
成为一种特性,然后拥有
ApplicationController
扩展
controller
,使用
SecurityController
并在
ApplicationController
中添加方法

public function beforeExecute($dispatcher)
{
    return $this->beforeExecuteTrait($this, $dispatcher);
}

通过对DevController应用相同的逻辑,我实现了期望的行为。

听起来您可以从中受益。换句话说,您将实例化其他类,然后将这些实例注入到主类中供您使用。这避免了PHP中继承的任何混乱

class A extends B {

}

class C {
    /** @var \A */
    protected $classa;

    public function __construct(\A $class) {
         $this->classa = $class;
    }
}

$a = new \A();
$c = new \C($a);

正如我在问题中所说的,我已经做了,但是适合traits的两个类(
DevController
SecurityController
)需要访问
Controller
中的方法。如果一个trait可以扩展一个完美的类……太棒了,@johncode,不知何故我对PHP trait一无所知。谢谢杰出的我一直在使用Phalcon框架,该框架大量使用了它,但我从未想到在这里使用它。我现在就试试,谢谢!