2016-03-28 20 views
7

私は、それぞれが同じ第三トレイトを継承する2つのPHPの形質を持っている:特質の衝突を避ける - use_once?

trait C { 
    public function smallTalk() { 
     echo 'c'; 
    } 
} 

trait A { 
    use C; 
    public function ac() { 
     echo 'a'.smallTalk(); 
    } 
} 

trait B { 
    use C; 
    public function bc() { 
     echo 'b'.smallTalk(); 
    } 
} 

を私はクラスでそれらの両方を使用したい:

class D { 
    use A, B; 
    public function acbc() { 
     echo ac().bc(); 
    } 
} 

が、私はエラー

を得続けます

Fatal error: Trait method smallTalk has not been applied, because there are collisions with other trait methods on D

私が知っているのはuse_onceではありませんが、私は同じ機能を探していますrequire_onceまたはinclude_onceが提供するが、形質のために。この例は単純化されています。私の本物のCにはたくさんのメソッドがあり、2つ以上の特性に継承されていますので、これらの特性を1つ以上使用するたびに長い文字列insteadofを繰り返す必要はありません。

+0

ショートバージョン:いいえ、手動で衝突を処理する特性を利用するための価格です。 – VolkerK

+0

私はあなたが形質を乱用していると思う。私は最後の手段としてのみ形質を使います。この回答は、代替案(C++では良い記述がありますが、主にOOP言語に適用されます)http://stackoverflow.com/questions/406081/why-should-i-avoid-multiple-inheritance-in-c#答え-407928 – Pevara

答えて

0

あなたは読ん必要があります:Conflict Resolution

If two Traits insert a method with the same name, a fatal error is produced, if the conflict is not explicitly resolved.

To resolve naming conflicts between Traits used in the same class, the insteadof operator needs to be used to choose exactly one of the conflicting methods.

Since this only allows one to exclude methods, the as operator can be used to allow the inclusion of one of the conflicting methods under another name.

例:

<?php 
trait A { 
    public function smallTalk() { 
     echo 'a'; 
    } 
    public function bigTalk() { 
     echo 'A'; 
    } 
} 

trait B { 
    public function smallTalk() { 
     echo 'b'; 
    } 
    public function bigTalk() { 
     echo 'B'; 
    } 
} 

class Talker { 
    use A, B { 
     B::smallTalk insteadof A; 
     A::bigTalk insteadof B; 
    } 
} 

class Aliased_Talker { 
    use A, B { 
     B::smallTalk insteadof A; 
     A::bigTalk insteadof B; 
     B::bigTalk as talk; 
    } 
} 
+0

あなたはその質問を読んだことがありますか? 「私の本当のCにはたくさんの方法があり、2つ以上の特性に引き継がれているので、これらの特性を1つ以上使用するたびに長い文字列を繰り返す必要はない」私はあなたが言っていることをすることができることを知っていますが、私は、より良い解決策があるかどうか尋ねていました。 – wogsland

+1

他の方法で競合を解決することはできません。形質+拡張を使用してください。 "すべて"正しいことをしたい場合 - 特性の助けを借りてすべてをやろうとしないでください。 クラスCをCから拡張して作成することができます。 実際の例はありません。どのアーキテクチャに当てはまるのでしょうか。 私はSOLIDに知り合うことをお勧めします。アーキテクチャの選択に役立ちます。 –

+0

OPが正しい答えであると思わない場合でも、これは正解であるため、上書きされます。 – mopsyd

関連する問題