Scénario:
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
Ce code ne fonctionne pas et je ne peux pas trouver un moyen d'appeler une fonction trait comme si elle avait été héritée. J'ai essayé d' appeler self::calc($v)
, static::calc($v)
, parent::calc($v)
, A::calc($v)
et les éléments suivants:
trait A {
function calc($v) {
return $v+1;
}
}
class MyClass {
use A {
calc as traitcalc;
}
function calc($v) {
$v++;
return traitcalc($v);
}
}
Rien ne fonctionne.
Existe-t-il un moyen de le faire fonctionner ou dois-je remplacer complètement la fonction de trait qui est beaucoup plus complexe que cela :)
A::calc(1)
Si la classe implémente directement la méthode, elle n'utilisera pas la version des traits. Peut-être que vous pensez à:
Parce que les classes enfants n'implémentent pas directement la méthode, elles utiliseront d'abord celle du trait s'il y a sinon celle de la classe parent.
Si vous le souhaitez, le trait peut utiliser la méthode dans la classe parente (en supposant que vous savez que la méthode serait là), par exemple
Vous pouvez également prévoir des moyens de remplacer, mais toujours accéder à la méthode de trait comme suit:
Vous pouvez le voir fonctionner à http://sandbox.onlinephpfunctions.com/code/e53f6e8f9834aea5e038aec4766ac7e1c19cc2b5
la source
Une approche alternative si vous êtes intéressé - avec une classe intermédiaire supplémentaire pour utiliser la voie OOO normale. Cela simplifie l'utilisation avec parent :: methodname
la source
trait
. Comme combiner plusieurs traits dans plusieurs classes (par exemple, trait A, B dans une classe, trait B, C, D dans une autre classe, trait A, C dans une autre classe, etc.)ScreenablePerson::save()
existe,Candidate
utiliseValidating
trait et étendScreenablePerson
, et les trois classes ontsave()
.Utiliser un autre trait:
la source