Переопределение свойств свойств доктрины
Я знаю, что вы можете переопределить метод 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';
}