У меня есть три класса и две черты:
- Мне нужно, чтобы в базовом классе был метод trBase-> load () для «Load Basic».
- Мне нужно, чтобы в классе Advanced использовался метод trAdvanced-> load () для «Load Advanced» и «Load Basic».
- Мне нужно, чтобы класс Zero имел метод trAdvanced-> load () для «Load Advanced» и «Load Basic».
Поскольку класс Zero не распространяется на базовый класс, я должен быть уверен, что этот и другие классы, использующие черту trAdvanced «импортирует или используют», также черта trBase.Затем я добавил use Trait trBase
к признаку trAdvanced.Теперь класс Advanced, кажется, имеет в два раза больше кода trAdvanced, потому что я получаю два раза «Загрузка расширенных» и «Загрузка базовых», и я могу дважды видеть метод Advanced-> init () в стеке вызовов отладчика.
Существует один способ использовать одну черту, только если она не «использована / импортирована» одним родительским классом?
class Base
{
use Trait trBase;
function init()
{
echo('Starting');
}
}
class Medium extends class Base
{
}
class Advanced extends class Medium
{
use Trait trAdvanced
}
class Zero
{
use Trait trAdvanced
}
trait trBase
{
function init()
{
parent::init();
$this->load();
}
function load()
{
echo('Loading Basic');
}
}
trait trAdvanced
{
use trBase;
function load()
{
echo('Loading Advanced');
parent::load();
}
}