模拟PHP中的多个继承



假设我有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();
       }
  }

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

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

您可以保留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();
       }
}

php没有"本机"多重继承,但是您可以通过使用特质来实现与之相似的东西。

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

在不修改类的情况下进行操作,最佳和优化的选项如下。

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

最新更新