Szenario:
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
Dieser Code funktioniert nicht und ich kann keine Möglichkeit finden, eine Merkmalsfunktion aufzurufen, wie sie geerbt wurde. Ich habe versucht Aufruf self::calc($v)
, static::calc($v)
, parent::calc($v)
, A::calc($v)
und die folgenden:
trait A {
function calc($v) {
return $v+1;
}
}
class MyClass {
use A {
calc as traitcalc;
}
function calc($v) {
$v++;
return traitcalc($v);
}
}
Nichts funktioniert.
Gibt es eine Möglichkeit, es zum Laufen zu bringen, oder muss ich die Trait-Funktion, die viel komplexer als diese ist, vollständig überschreiben :)
A::calc(1)
Wenn die Klasse die Methode direkt implementiert, wird die Merkmalsversion nicht verwendet. Vielleicht denken Sie an:
Da die untergeordneten Klassen die Methode nicht direkt implementieren, verwenden sie zuerst die des Merkmals, wenn andernfalls die der übergeordneten Klasse verwendet wird.
Wenn Sie möchten, kann das Merkmal eine Methode in der übergeordneten Klasse verwenden (vorausgesetzt, Sie wissen, dass die Methode vorhanden ist), z
Sie können auch Möglichkeiten zum Überschreiben bereitstellen, aber dennoch wie folgt auf die Trait-Methode zugreifen:
Sie können es unter http://sandbox.onlinephpfunctions.com/code/e53f6e8f9834aea5e038aec4766ac7e1c19cc2b5 sehen
quelle
Ein alternativer Ansatz bei Interesse - mit einer zusätzlichen Zwischenklasse, um den normalen OOO-Weg zu verwenden. Dies vereinfacht die Verwendung mit parent :: methodname
quelle
trait
s haben. Wie das Kombinieren mehrerer Merkmale in mehreren Klassen (z. B. Merkmal A, B in einer Klasse, Merkmal B, C, D in einer anderen Klasse, Merkmal A, C in einer anderen Klasse usw.)ScreenablePerson::save()
existiert,Candidate
verwendetValidating
Merkmal und erweitertScreenablePerson
, und alle drei Klassen habensave()
.Verwenden eines anderen Merkmals:
quelle