2016-07-08 4 views
0

У меня есть класс, который расширяет другой класс и использует черту.Вызов собственного метода из признака

class A extends ABase 
{ 
    use MyTrait; 
    //... 
} 

расширенного класса (ABase) расширяет другой класс (ABase2), который расширяет абстрактный класс (ABase3).

При создании класса A конструктор признаков выполняется потому, что конструктор не определен в A. В то же время конструктор признаков вызывает метод (configureOptions), который определен в признаке, но также и в абстрактном классе ABase3 с той же видимостью (защищенной).

trait MyTrait 
{ 
    public function __construct($options) 
    { 
     //... 
     $this->configureOptions($resolver); 
     //... 
    } 

    protected function configureOptions($resolver) 
    { 
     // Define options 
    } 
} 

То, что я не понимаю, что когда configureOptions вызывается из признака, метод выполняется не метод, определенный в черте, но один определенный в абстрактном классе (ABase3).

Как PHP docs говорит: Унаследованный элемент из базового класса переопределяется членом, вставленным в Trait. Порядок приоритета состоит в том, что члены из текущего класса переопределяют методы Trait, которые, в свою очередь, переопределяют унаследованные методы.

Ничего не говорит о вызовах методов из одного и того же признака, но не должен сначала проверять методы внутри его собственного класса?

Edit:

не только абстрактный класс (ABase3) имеет метод configureOptions, но и класс, но опять-таки, метод вызывается из признака следует назвать собственный метод класса. Не так ли?

ответ

1

У меня есть решение от this answer.

class A extends ABase 
{ 
    use MyTrait { 
     configureOptions as traitConfigureOptions; 
    } 
    //... 
} 

, а затем, вместо parent::configureOptions($resolver):

$this->traitConfigureOptions($resolver); 
Смежные вопросы