Переопределение свойств свойств доктрины

Я знаю, что вы можете переопределить метод trait , объявив его в своем классе, мне было любопытно, возможно ли преодолеть trait Свойство путь. Это безопасно? Его нет в Документации, поэтому я не решаюсь реализовать это.

Из документации

An inherited member from a base class is overridden by a member inserted by a Trait. The precedence order is that members from the current class override Trait methods, which in turn override inherited methods.

http://php.net/manual/en/language.oop5.traits.php

Ответ 1

Вы можете объявить свойство trait в классе, но вы должны сохранить то же определение из trait. Его нельзя переопределить с помощью другого определения. Таким образом, поскольку у вас уже есть доступ к свойствам trait из класса, он не нуждается в повторном переопределении. Подумайте, что trait работает как код для копирования.

<?php
trait FooTrait 
{
    protected $same       = '123';
    protected $mismatch  = 'trait';
}

class FooClass 
{
    protected $same      = '123';

    // This override property produces: 
    // PHP Fatal error:  FooClass and FooTrait define the same property
    // ($mismatchValue) in the composition of FooClass. However, the definition
    // differs and is considered incompatible
    protected $mismatch  = 'class';

    use FooTrait;
}

Ответ 2

Вы не можете переопределить свойство trait в классе, где используется признак. Однако вы можете переопределить свойство trait в классе, который расширяет класс, в котором используется признак. Например:

trait ExampleTrait
{
    protected $someProperty = 'foo';
}

abstract class ParentClass
{
    use ExampleTrait;
}

class ChildClass extends ParentClass
{
    protected $someProperty = 'bar';
}