Ответ на Ваше редактирование:
, Если Вы действительно хотите фальсифицировать множественное наследование, можно использовать волшебную функцию __ вызов ().
Это ужасно, хотя это работает с точки зрения пользователя класса 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 еще не поддерживает несколько наследование классов, он действительно однако поддерживает, несколько соединяют интерфейсом с наследованием.
См. http://www.hudzilla.org/php/6_17_0.php для некоторых примеров.
PHP не позволяет множественное наследование, но можно сделать с реализацией нескольких интерфейсов. Если реализация "тяжела", обеспечьте скелетная реализация для каждого интерфейса в отдельном классе. Затем Вы можете делегат весь интерфейсный класс к этим скелетным реализациям через объектное включение .
Существуют планы относительно добавления соединения-ins скоро, я верю.
, Но до тех пор, пойдите с принятым ответом. Можно абстрагировать это немного для создания "растяжимого" класса:
class Extendable{
private $extender=array();
public function addExtender(Extender $obj){
$this->extenders[] = $obj;
$obj->setExtendee($this);
}
public function __call($name, $params){
foreach($this->extenders as $extender){
//do reflection to see if extender has this method with this argument count
if (method_exists($extender, $name)){
return call_user_func_array(array($extender, $name), $params);
}
}
}
}
$foo = new Extendable();
$foo->addExtender(new OtherClass());
$foo->other_class_method();
Примечание, которое в этой модели "OtherClass" добирается для 'знания' о $foo. OtherClass должен иметь государственную функцию, вызванную "setExtendee" для установки этих отношений. Затем если это - методы, вызываются от $foo, это может получить доступ к $foo внутренне. Это, однако, не доберется, доступ к любым частным/защищенным методам/переменным как реальный расширенный класс был бы.
Я прочитал несколько статей обескураживающее наследование в проектах (в противоположность библиотекам/платформам), и призывающий к программе против интерфейсов, нет против реализаций.
Они также защищают OO составом: при необходимости в функциях в классе a и b сделайте c наличием участников/полей этого типа:
class C
{
private $a, $b;
public function __construct($x, $y)
{
$this->a = new A(42, $x);
$this->b = new B($y);
}
protected function DoSomething()
{
$this->a->Act();
$this->b->Do();
}
}
Классы не предназначены, чтобы быть просто наборами методов. Класс, как предполагается, представляет абстрактное понятие, и с состоянием (поля) и с поведением (методы), который изменяет состояние. Используя наследование только для получения некоторого желаемого поведения походит на плохой дизайн OO и точно причину, почему много языков запрещают множественное наследование: для предотвращения "наследования спагетти", т.е. расширения 3 классов, потому что у каждого есть метод, в котором Вы нуждаетесь, и окончание с классом, который наследовал 100 методов и 20 полей, все же только когда-либо использует 5 из них.
У Вас не может быть класса, который расширяет два базовых класса. Вы не могли иметь.
// this is NOT allowed (for all you google speeders)
Matron extends Nurse, HumanEntity
у Вас могла однако быть иерархия следующим образом...
Matron extends Nurse
Consultant extends Doctor
Nurse extends HumanEntity
Doctor extends HumanEntity
HumanEntity extends DatabaseTable
DatabaseTable extends AbstractTable
и так далее.