2015-11-09 3 views
2

Извините, если это дубликат, я ранее искал ответ.PHP Trait colliding constructor

Я изо всех сил пытаюсь перегрузить метод, определенный в признаке. Он бросает фатальную ошибку:

Fatal error: Configuration has colliding constructor definitions coming from traits in Configuration.php on line 18

Их класс

<?php 

namespace Theirs\Package; 

use Theirs\TheirTrait; 

class Configration 
{ 
    use TheirTrait; 
} 

Мой класс

<?php 

namespace My\Package; 

use Theirs\Package\Configuration as BaseConfiguration; 
use My\Trait\MyTrait; 

class Configuration extends BaseConfiguration 
{ 
    use MyTrait; 
} 

Мой Trait

use Theirs\TheirTrait as BaseSomeTrait; 

trait MyTrait 
{ 
    use BaseSomeTrait; 

    protected function someMethod($something) 
    { 
     // ... 
    } 
} 

ответ

7

Вы можете разрешить столкновение конструктора следующим образом.

trait MyTrait { 

    use BaseSomeTrait{ 
     BaseSomeTrait::__construct as private __otherConstruct; 
    } 

    public function __construct(/* maybe params here*/) 
    { 
     // maybe other code 
     $this->__otherConstruct(/* maybe params here*/); 
     // maybe other code 
    } 
} 

если MyClass есть конструктор, а вам нужно сделать, это есть, кроме того, или, может быть только там, если MyTrait не имеет конструктора ...

+0

Спасибо, я делал это на начальном этапе. Оказывается, это был еще один класс глубже, что приводило к зависимости. –

0

Похоже, что у Theirs\TheirTrait\Configration и Theirs\Package\Configuration есть конструктор, а подписи конструктора несовместимы. (Но без кода обоих, трудно сказать.)

Если Theirs\Package\Configuration действительно предназначен для использования с Theirs\TheirTrait\Configration, вам следует написать им отчет об ошибке. В противном случае я предполагаю, что должна быть какая-то документация о том, как использовать класс и черту в коде, чтобы они не приводили к ошибкам.