回答您的编辑:
如果您确实想伪造多重继承,则可以使用魔术函数__call()。
尽管从A类用户的角度来看,这很丑陋:
class B {
public function method_from_b($s) {
echo $s;
}
}
class C {
public function method_from_c($s) {
echo $s;
}
}
class A extends B
{
private $c;
public function __construct()
{
$this->c = new C;
}
// fake "extends C" using magic function
public function __call($method, $args)
{
$this->c->$method($args[0]);
}
}
$a = new A;
$a->method_from_b("abc");
$a->method_from_c("def");
打印“ abcdef”
我实际上很喜欢扩展类的想法,用这种方法进行操作是否有任何已知的限制?
据我所知,PHP对于这样的小技巧来说是一种非常宽松的语言。:)正如其他人指出的那样,这并不是正确的OOP方法。
您将无法使用受保护的方法或私有方法。
@wormhit,但是,我不建议在生产中使用它,可以使用ReflectionClass来访问私有和受保护的方法。
这对于Implements无效,后者希望该方法实际存在,并且当多个基类具有相同名称的方法时,该行为几乎是未定义的。它还会破坏编辑器给您提示的能力。