[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: наследование нескольких предков
Страницы: 1, 2, 3
durex_funn
class A1{ база }
class B1 extends A1{}
class B2 extends A1{}

и вот тут появился класс

class A2{другая база}

теперь надо чтоб

class B1 extends A1 и A2{}

это возможно как нибудь?
sergeiss
Гугли по словам "множественное наследование php".

До ПХП 5.4 сие было невозможно "в лоб", в 5.4 сделали что-то http://php.net/manual/ru/language.oop5.traits.php

Детальнее не скажу, не работал с этим.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
durex_funn
спасибо, кажется то что надо
Invis1ble
traits - это не множественное наследование, а своего рода костыль smile.gif

_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

vital
Трейты не то и не для того.
Лучше просто создать в классе наследнике 2 экзмепляра родителей, и потом через __get() __set() __call() __invoke() вызывать методы из нужного родителя проверяя в каком из них они есть. Это более правильный workaround чем переписывать все на трейты.

И есть еще паттерн для этого, забыл как его sad.gif

_____________
"Нужно быть готовым прислушиваться к тем, кто может тебя чему-нибудь научить. Иначе ты никогда не вырастешь."

Откровенно я никому ниразу не нагрубил. А дать подзатыльник зарвавшемуся юнцу, так это и ему на пользу, и мне в удовольствие. © AllesKlar
vital
Во, нагуглил красивую реализацию о чем говорил:
    class Exception_Callback_Absent extends Exception
{
function __construct()
{
parent::__construct();
}
}


class Exception_Callback_Deny extends Exception
{
function __construct()
{
parent::__construct();
}
}


class Inheritance
{
protected $_rgInheritance=array();
protected function createInheritance($rParent, $bAllowInstances=false)
{
$bReject=false;
if(get_class($this)!=get_class($rParent))
{
foreach($this->_rgInheritance as $rClass)
{
if(get_class($rClass)==get_class($rParent))
{
$bReject=true;
break;
}
}
}

else
{
$bReject=true;
}
if($bAllowInstances || !$bReject)
{
$this->_rgInheritance[]=$rParent;
}
}

public function __call($sMethod, $rgParameters)
{
$fnBind = function($sMethod, $rgParameters)
{
if(method_exists($this, $sMethod))
{
$rReflect = new ReflectionMethod($this, $sMethod);
if($rReflect->isPrivate())
{
throw new Exception_Callback_Deny();
}
return $this->$sMethod($rgParams);
}
else
{
throw new Exception_Callback_Absent();
}
}
;
$bExecuted=false;
foreach($this->_rgInheritance as $rParent)
{
try
{
$fnBind = $fnBind->bindTo($rParent, $rParent);
$fnBind($sMethod, $rgParameters);
$bExecuted=true;
break;
}
catch(Exception_Callback_Deny $e)
{
throw $e;
}
catch(Exception_Callback_Absent $e)
{
continue;
}
}

if(!$bExecuted)
{
throw new Exception_Callback_Absent();
}
}
}


class Foo
{
public function doFoo()
{
echo('called doFoo()'.PHP_EOL);
}

protected function protectedFoo()
{
echo('called protectedFoo()'.PHP_EOL);
}
}


class Bar
{
public function doBar()
{
echo('called doBar()'.PHP_EOL);
}

private function privateBar()
{
echo('called privateBar()'.PHP_EOL);
}
}


class FooBar extends Inheritance
{
public function __construct()
{
$this->createInheritance(new Foo);
$this->createInheritance(new Bar);
}
}


$rTest = new FooBar();
$rTest->doFoo();
$rTest->doBar();
$rTest->protectedFoo();
$rTest->privateBar();
$rTest->notExists();


_____________
"Нужно быть готовым прислушиваться к тем, кто может тебя чему-нибудь научить. Иначе ты никогда не вырастешь."

Откровенно я никому ниразу не нагрубил. А дать подзатыльник зарвавшемуся юнцу, так это и ему на пользу, и мне в удовольствие. © AllesKlar
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.