Дублированная черта, импортированная в класс php - PullRequest
0 голосов
/ 29 мая 2018

У меня есть три класса и две черты:

  • Мне нужно, чтобы в базовом классе был метод 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();
    }
}

1 Ответ

0 голосов
/ 29 мая 2018

Надеюсь, этот пример кода пригодится для вас:

<?php

class Base
{
    use  trBase;

    function init()
    {
        echo('Starting');
    }
}

class Medium extends  Base
{
}

class Advanced extends  Medium
{
    use trAdvanced;
}

class Zero
{


    use trAdvanced, trBase {
        trAdvanced::load as trAdvancedLoad;
        trBase::load insteadof trAdvanced;
    }
}

trait trBase
{
    function init()
    {
        parent::init();

    }

    function load()
    {
        echo('Loading Basic');
    }
}

trait trAdvanced
{

    function load()
    {
        echo('Loading Advanced');
    }
}


# --------------------------------------------------
//$base_obj=new Base();
//printf($base_obj->load());
# --------------------------------------------------

$zero_obg=new Zero();
printf($zero_obg->load() , $zero_obg->trAdvancedLoad());
...