在PHP中模拟多重继承

时间:2014-01-24 16:58:54

标签: php multiple-inheritance

假设我有2个班级

Class A {
    public function doA(){
        echo "Im A";
    }
}
Class B {
    public function doB(){
        echo "Im B";
    }
}

编写C类,以便运行以下代码:

  $c = new C();
  $c->doA();
  $c->doB();

和输出:

>> Im A
>> Im B

这是在测试中,条件是:

  • 不使用静态调用
  • 您无法修改A类或B类

所以我写道:

Class C {

       public function doA() {
             $a = new A();
             $a->doA();
       }

       public function doB() {
             $b = new B();
             $b->doB();
       }

  }

显然我错了,因为它可以“更优化”

有人可以告诉我该怎么做吗?

3 个答案:

答案 0 :(得分:5)

您可以保留AB的实例,而不是每次都实例化它们。

class C {
       private $a, $b;

       public __construct() {
             $this->a = new A();
             $this->b = new B();
       }

       public function doA() {
             $this->a->doA();
       }

       public function doB() {
             $this->b->doB();
       }
}

答案 1 :(得分:2)

PHP没有“本机”多重继承,但您可以使用traits来实现类似的东西。

Trait A {
    public function doA(){
        echo "Im A";
    }
}

Trait B {
    public function doB(){
        echo "Im B";
    }
}

Class C {
    use A, B;
}

$c = new C;
$c->doA();
$c->doB();

请注意,这至少需要 PHP 5.4

答案 2 :(得分:1)

要在不修改类的情况下执行此操作,最佳和优化的选项将如下所示。

class C {
    private $a;
    private $b;

    public __construct() {
        $this->a = new A();
        $this->b = new B();
    }

    public function __call($method, $arguments = array()) {
        if(method_exists($this->as, $method)) {
            return call_user_func(array($this->a, $method));
        }
    }
}

以上也是未来的证据,因此也会增加新的方法。

虽然你被告知不要修改A类和B类,但正确的方法是让B扩展A,然后使C扩展B,如下所示。

class A {
    public function doA(){
        echo "Im A";
    }
}
class B extends A {
    public function doB(){
        echo "Im B";
    }
}
class C extends B {

}

$c = new C();
$c->doA();
$c->doB();