Удалить черту из родительского класса - PullRequest
0 голосов
/ 30 ноября 2018

Вот сценарий

У меня есть черта входа в систему ...

trait LoginTrait {

     public function login() {

         // some login code here
     }

     public function someOtherFunction() {

         // some elite code here
     }
}

У меня есть базовый (родительский) контроллер ...

class BaseUserController {

    use LoginTrait;
}

У меня есть другая черта, где я переопределяю функцию входа в систему ...

trait MyLoginTrait {

     use LoginTrait {
          Traits\LoginTrait::login as oldLogin;
     }

     public function login() {

          // some new elite login code
     }
 }

У меня есть контроллер, который расширяет BaseUsersController ...

class UsersController extends BaseUserController {

     use MyLoginTrait;
}

Мой вопрос: как мнеудалить LoginTrait из BaseUserController?

Прямо сейчас я пытаюсь войти, и функция входа из LoginTrait запускается, а не MyLoginTrait с новой функцией входа ...

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Скорее всего, ваша проблема в другом месте.Перезапись унаследованных черт другими чертами работает следующим образом:

<?php

trait A
{
  public function doIt()
  {
    echo "DoIt from A." . PHP_EOL;
  }
}

trait B
{
  public function doIt()
  {
    echo "DoIt from B." . PHP_EOL;
  }
}

class X
{
  use A;
}

class Y extends X
{
  use B;
}

$foo = new Y();
$foo->doIt();

Вывод (PHP 7.2): DoIt from B.

Вы даже можете использовать parent::doIt(); с B::doIt для вызова того же самогометод черты A - без необходимости «переименовывать» перезаписанный метод, используя as.

Чтобы ответить на ваш вопрос напрямую: вы не можете «удалить» черту из суперкласса - вам придется жить сунаследованный метод, но вы можете перезаписать его.Альтернатива: измените иерархию наследования.

0 голосов
/ 30 ноября 2018

Это может помочь вам на вашем пути

<?php

trait LoginTrait
{
    public function login()
    {
        echo 'in LoginTrait::login()' . '<br />';
        // some login code here
    }

    public function someOtherFunction()
    {
        // some elite code here
    }
}

trait MyLoginTrait
{
    public function login()
    {
        echo 'in MyLoginTrait::login()' . '<br />';
        // some new elite login code
    }
}

class BaseUserController
{
    use LoginTrait;
}

class UsersController extends BaseUserController
{
    use LoginTrait, MyLoginTrait {
        MyLoginTrait::login as myLogin;
        LoginTrait::login insteadof MyLoginTrait;
    }
}

$user = new UsersController();
$user->login();// output: in LoginTrait::login()
$user->myLogin();// output: in MyLoginTrait::login()

ИЛИ ИСПОЛЬЗОВАТЬ:

class UsersController extends BaseUserController
{
    use LoginTrait, MyLoginTrait {
        MyLoginTrait::login insteadof LoginTrait;
    }
}

$user = new UsersController();
$user->login(); // output: in MyLoginTrait::login()
...