2016-03-28 21 views
7

Her aynı 3 özellikten diğerine devralan iki PHP özelliklere sahiptir:Sürekli çarpışmalardan kaçınmak - 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(); 
    } 
} 

Ve Bir sınıfa ikisini de kullanmak istiyorum:

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

ama hata

almaya devam

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

Biliyorum use_once bir şey değil, aynı işlevselliği arıyorum require_once veya include_once özellikleri, ancak özellikleri için. Bu örnek basitleştirilmiştir. Benim gerçek C benim çok fazla yöntem var ve 2'den fazla özellik tarafından devralınmıştır, bu yüzden bu özelliklerin her birini kullandığımda her zaman uzun bir insteadof dizesini tekrarlamak istemiyorum. 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.

Örnek:

+0

kısa versiyon: Hayır, elle çakışmaları önleyen özellikleri kullanmak için fiyatıdır. – VolkerK

+0

Özelliklerini kötüye kullandığınızdan şüpheleniyorum. Özellikleri yalnızca son çare olarak kullanıyorum. Bu cevabın alternatifler üzerinde iyi bir açıklaması vardır (C++ 'da, ancak çoğunlukla herhangi bir OOP diline uygulanırlar) http://stackoverflow.com/questions/406081/why-should-i-avoid-multiple-inheritance-in-c# answer-407928 – Pevara

cevap

0

okumak gerek

<?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

Soruyu okudun mu? "Gerçek C'm çok fazla metodu var ve 2'den fazla özelliğe sahip. Bu yüzden bu özelliklerin her birini kullandığım her zaman uzun bir diziyi tekrarlamak zorunda değilim." Söylediklerinizi yapabileceğimi biliyorum, ama bir _better_ çözümü olup olmadığını soruyordum. – wogsland

+1

Çatışmayı başka yollarla çözemezsiniz. Özelliği + genişletilmiş kullanın. Eğer her şeyi "doğru" yapmak istiyorsanız - herşeyi özelliğin yardımıyla yapmaya çalışmayın. C. sınıfından uzatılmış bir C sınıfı oluşturabilirsiniz. Gerçek bir örnek olmaksızın - hangi mimarinin doğru olacağını söylemek zor. SOLID ile tanışmalarını tavsiye ederim. Mimariyi seçmede yardımcı olabilir. –

+0

Doğru cevabı bu yana, çünkü bu doğru cevap, OP buna benzemese bile doğru cevap. – mopsyd

İlgili konular