Scenariusz:
trait A {
function calc($v) {
return $v+1;
}
}
class MyClass {
use A;
function calc($v) {
$v++;
return A::calc($v);
}
}
print (new MyClass())->calc(2); // should print 4
Ten kod nie działa i nie mogę znaleźć sposobu na wywołanie funkcji cechy, tak jak została odziedziczona. Próbowałem nazywając self::calc($v)
, static::calc($v)
, parent::calc($v)
, A::calc($v)
i są następujące:
trait A {
function calc($v) {
return $v+1;
}
}
class MyClass {
use A {
calc as traitcalc;
}
function calc($v) {
$v++;
return traitcalc($v);
}
}
Nic nie działa.
Czy istnieje sposób, aby to działało, czy muszę całkowicie zastąpić funkcję cechy, która jest o wiele bardziej złożona niż to :)
A::calc(1)
Jeśli klasa implementuje metodę bezpośrednio, nie będzie używać wersji cech. Być może chodzi ci o:
Ponieważ klasy potomne nie implementują metody bezpośrednio, najpierw wykorzystają tę cechę, jeśli w przeciwnym razie skorzystają z cechy nadrzędnej.
Jeśli chcesz, cecha może użyć metody w klasie nadrzędnej (zakładając, że wiesz, że metoda tam będzie) np
Możesz także podać sposoby zastąpienia, ale nadal uzyskujesz dostęp do metody cechy w następujący sposób:
Możesz zobaczyć, jak działa na http://sandbox.onlinephpfunctions.com/code/e53f6e8f9834aea5e038aec4766ac7e1c19cc2b5
źródło
Alternatywne podejście w razie zainteresowania - z dodatkową klasą pośrednią do korzystania z normalnego sposobu OOO. Upraszcza to korzystanie z parent :: methodname
źródło
trait
s. Jak łączenie wielu cech w wielu klasach (np. Cecha A, B w klasie, cecha B, C, D w innej klasie, cecha A, C w innej klasie i tak dalej)ScreenablePerson::save()
istnieje,Candidate
używaValidating
cechy i rozszerzaScreenablePerson
, i wszystkie trzy klasy mająsave()
.Używając innej cechy:
źródło