假设我有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
这是在测试中,条件是:
所以我写道:
Class C {
public function doA() {
$a = new A();
$a->doA();
}
public function doB() {
$b = new B();
$b->doB();
}
}
显然我错了,因为它可以“更优化”
有人可以告诉我该怎么做吗?
答案 0 :(得分:5)
您可以保留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();
}
}
答案 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();