2015-09-14 7 views
10

私はあなたのクラスでそれを宣言することによって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リンクに感謝します。私は、 "上書き"という言葉を "宣言"に置き換え、異なる定義で上書きすることはできないと明言しています。これがあなたを助けることを願っています – martinezdelariva

13

形質が使用されるクラスで形質のプロパティを上書きすることはできません。ただし、特性が使用されるクラスを拡張するクラスの特性のプロパティをオーバーライドすることはできます。例:

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

abstract class ParentClass 
{ 
    use ExampleTrait; 
} 

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