假设我有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();
}
}
显然我错了,因为它可以"更优化"
有人可以告诉我怎么做吗?
您可以保留A
和B
的实例,而不是每次实例化。
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();