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 devamFatal 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:
kısa versiyon: Hayır, elle çakışmaları önleyen özellikleri kullanmak için fiyatıdır. – VolkerK
Ö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