2015-09-14 2 views
10

Я знаю, что вы можете переопределить traitметод, объявив его в своем классе, мне было интересно, если можно было более ездить на 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

Член может быть собственностью или способом, поэтому я бы предположил, что да. Doctrine использует DocBlock при поиске свойств объекта, поэтому я бы предположил, что это чрезмерно. Лучше всего было бы просто попробовать. Создайте сущность, использующую черты, используйте инструмент схемы Doctrine, чтобы узнать, что будет SQL, затем переопределите другой DocBlock и посмотрите, что происходит (не забудьте очистить кеш, если вы его используете). – DanielM

ответ

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; 
} 
+4

Ужасный ответ, сначала противоречие «вы можете переопределить, но вы не можете» Решите. Во-вторых, пример не объясняет ничего, что мы уже не знали, и не дает практического решения. Лучше ответьте здесь http://stackoverflow.com/a/20437742/208946 – goyote

+0

@goyote спасибо за ссылку. Я заменил слово «override» на «declare» и явно сказал, что нельзя переопределить с помощью другого определения. Надеюсь, это поможет вам. – martinezdelariva

13

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

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

abstract class ParentClass 
{ 
    use ExampleTrait; 
} 

class ChildClass extends ParentClass 
{ 
    protected $someProperty = 'bar'; 
} 
Смежные вопросы