Cenário:
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
Esse código não funciona e não consigo encontrar uma maneira de chamar uma função de característica como se fosse herdada. Tentei ligar self::calc($v)
, static::calc($v)
, parent::calc($v)
, A::calc($v)
e o seguinte:
trait A {
function calc($v) {
return $v+1;
}
}
class MyClass {
use A {
calc as traitcalc;
}
function calc($v) {
$v++;
return traitcalc($v);
}
}
Nada funciona.
Existe uma maneira de fazê-lo funcionar ou devo substituir completamente a função de característica que é muito mais complexa do que isso :)
A::calc(1)
Se a classe implementar o método diretamente, não usará a versão de características. Talvez o que você está pensando é:
Como as classes filho não implementam o método diretamente, elas primeiro usarão a característica, caso contrário, a classe pai.
Se você quiser, a característica pode usar o método na classe pai (supondo que você saiba que o método estaria lá), por exemplo
Você também pode fornecer maneiras de substituir, mas ainda acessar o método de característica da seguinte maneira:
Você pode vê-lo funcionar em http://sandbox.onlinephpfunctions.com/code/e53f6e8f9834aea5e038aec4766ac7e1c19cc2b5
fonte
Uma abordagem alternativa, se estiver interessado - com uma classe intermediária extra para usar a via OOO normal. Isso simplifica o uso com parent :: methodname
fonte
trait
s. Como combinação de múltiplos traços em várias classes (por exemplo característica A, B, em uma classe, traço B, C, D na outra classe, característica A, C em outra classe e assim por diante)ScreenablePerson::save()
existe,Candidate
usaValidating
característica e se estendeScreenablePerson
, e todas as três classes têmsave()
.Usando outra característica:
fonte