Guión:
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
Este código no funciona, y no puedo encontrar una manera de llamar a una función de rasgo como si se heredara. Traté de llamar self::calc($v)
, static::calc($v)
, parent::calc($v)
, A::calc($v)
y los siguientes:
trait A {
function calc($v) {
return $v+1;
}
}
class MyClass {
use A {
calc as traitcalc;
}
function calc($v) {
$v++;
return traitcalc($v);
}
}
Nada funciona.
¿Hay alguna manera de hacerlo funcionar o debo anular por completo la función de rasgo que es mucho más compleja que esto :)
A::calc(1)
Si la clase implementa el método directamente, no utilizará la versión de rasgos. Quizás lo que estás pensando es:
Debido a que las clases secundarias no implementan el método directamente, primero usarán el del rasgo si de lo contrario usan el de la clase principal.
Si lo desea, el rasgo puede usar el método en la clase padre (suponiendo que sepa que el método estaría allí), por ejemplo
También puede proporcionar formas de anular, pero aún acceder al método de rasgos de la siguiente manera:
Puede verlo funcionar en http://sandbox.onlinephpfunctions.com/code/e53f6e8f9834aea5e038aec4766ac7e1c19cc2b5
fuente
Un enfoque alternativo si está interesado, con una clase intermedia adicional para usar la forma normal de OOO. Esto simplifica el uso con parent :: methodname
fuente
trait
s. Como combinar múltiples rasgos en múltiples clases (p. Ej., Rasgo A, B en una clase, rasgo B, C, D en otra clase, rasgo A, C en otra clase, etc.)ScreenablePerson::save()
existe,Candidate
usaValidating
rasgo y se extiendeScreenablePerson
, y las tres clases tienensave()
.Usando otro rasgo:
fuente