Почему я не могу переопределить свойство трейта?

Я хочу сделать так:

trait T
{
    public $a = [];
}

class X
{
    use T;
    
    public $a = [1, 2, 3];
}

Но мне пишет: Fatal error: X and T define the same property ($a) in the composition of X. However, the definition differs and is considered incompatible.

В чем проблема? И как тогда по другому сделать? Я хотел именно так... Это было бы очень удобно!


Ответы (1 шт):

Автор решения: Вадим Александру

Если трейт определяет свойство, то класс не может определить свойство с таким же именем, кроме случаев полного совпадения (те же начальное значение и модификатор видимости), иначе будет сгенерирована фатальная ошибка. До PHP 7.0.0 при определении свойства в классе, полностью идентичное свойству трейта, выдавалась ошибка уровня E_STRICT.

trait FooTrait
{
    public $same = true;
    public $different = false;
}

class FooClass
{
    use FooTrait;

    /*
     * Допустимо с PHP 7.0.0. 
     * В более ранних версиях ошибка уровня E_STRICT
     */
    public $same = true;
    /*
     * Фатальная ошибка
     */
    public $different = true; 
}

Подробнее про трейты можете почитть Здесь

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

Например:

trait FooTrait
{
    public $same = true;
    public $different = false;

    public function getSame()
    {
        return $this->same;
    }

    public function getDifferent()
    {
        return $this->different;
    }


}

class FooClass
{
    use FooTrait;
    
    public function getDifferent()
    {
        return ! $this->different;
    }


}
→ Ссылка