tipos - Diferencia entre un rasgo y una clase abstracta en PHP
tipos de metodos en php (2)
Recientemente encontré Traits en PHP y estoy tratando de entenderlos. Durante mi investigación, me topé con esta pregunta de desbordamiento de pila: rasgos frente a interfaces . La respuesta aceptada menciona lo siguiente:
Una interfaz define un conjunto de métodos que la clase implementadora debe implementar.
Cuando se usa un rasgo, también se implementan los métodos, lo que no ocurre en una interfaz.
Hasta ahora todo bien, pero esto suena exactamente como la diferencia entre una interfaz y una clase abstracta para mí. Así que esto plantea una pregunta de seguimiento para mí:
- ¿Cuál es la diferencia entre un rasgo y una clase abstracta en PHP?
Soy consciente de que puedo extenderme desde una sola clase abstracta y, por otro lado, usar cualquier cantidad de rasgos. Pero, ¿es esta realmente la única diferencia? Todavía no entiendo completamente los rasgos y su uso.
No exactamente ... Vamos a citar la documentación oficial para este propósito:
Un rasgo es similar a una clase, pero solo pretende agrupar la funcionalidad de forma precisa y consistente. No es posible instanciar un Rasgo por sí solo. Es una adición a la herencia tradicional y permite la composición horizontal del comportamiento; es decir, la aplicación de miembros de clase sin necesidad de herencia.
Por lo tanto, los rasgos se utilizan con fines de composición para permitir que la clase realice alguna lógica / comportamiento. Si está heredando de otra clase / abstracta, generalmente es para fines de polimorfismo y obtiene una jerarquía de herencia / clase distinta, que puede o no ser conveniente.
Creo que todo depende del contexto, de la arquitectura y de lo que está tratando de hacer exactamente.
Los rasgos te permiten compartir código entre tus clases sin forzarte a una jerarquía de clases específica . Digamos que desea que todas sus clases tengan el método de utilidad conveniente foo($bar)
; Sin rasgos tienes dos opciones:
- Implementarlo individualmente con redundancia de código en cada clase.
- heredar de una clase ancestral común (abstracta)
Ambas soluciones no son ideales, cada una con sus diferentes compromisos. La redundancia de código es obviamente indeseable, y la herencia de un ancestro común hace que el diseño de la jerarquía de clases sea inflexible.
Los rasgos resuelven este problema permitiéndole implementar foo($bar)
en un rasgo que cada clase puede "importar" individualmente, al mismo tiempo que le permite diseñar su jerarquía de clases según los requisitos de lógica empresarial, no las necesidades de idioma.