Traits En La Programación Orientada A Objetos

Traits en la programación orientada a objetos

Continuamos con otro artículo mas sobre el curso de programación orientada a objetos. Si estas siguiendo los post día a día segurísimo que ya tienes unos conocimientos bastante avanzados y sino ¿a qué esperas gandul? Hoy vamos a explicar qué son los traits y cómo podemos utilizarlos así que… vamos allá!

¿Qué son los Traits?

Lo primero que tenemos que saber es que los traits son una característica propia de PHP y que fueron implementados en su versión 5.4. En otros lenguajes de programación te puedes encontrar con aproximaciones a los traits pero no como tal lo vamos a ver con PHP.

Los traits son un método que podemos utilizar para reutilizar código, ya sabes filosofía DRY y todo eso…

Como por su propia naturaleza PHP no implementa la herencia múltiple, podemos utilizar esta característica para solventar ese problema.

Así pues la naturaleza de un trait es reducir las limitaciones de la herencia simple permitiendo que nosotros, los programadores, podamos reutilizar fragmentos de código en un conjunto de clases independientes y jerárquicas una y otra vez y toooodas las veces que queramos, todo un lujazo para evitar duplicar código y trabajar mas 😛

Los traits son parecidos a las clases. Ellos agrupan funcionalidades muy específicas y de una forma coherente. Imagina que tienes una función que se conecta a la base de datos y escribe en una tabla de log la fecha y el nombre de cada una de las clases cada vez que se instancian.

Pues si no existieran los traits tendrías que escribir esta funcionalidad, con su complejidad, en todas las clases y sería un error porque si quisieras sustituir algo de la función tendrías que ir clase a clase y cambiando lo que quisieras on the fly y luego revisar que no te has olvidado nada y que no la has cagado en ninguna parte, un coñazo vamos…

Creando un solo ficherito con la funcionalidad y después añadiéndolo a tus clases como un trait ya tenemos apañao el problema.

Decía antes que un trait es como si fuera una clase, como si fuera ya que no lo es exactamente y por lo cual jamás vas a poder instanciar directamente un trait. Piensa en ellos como en un añadido a la herencia tradicional que nos habilita la composición horizontal de comportamientos, quiero decir, puedes añadir tantas funcionalidades transversales a las clases como te de la gana y sin tener que recurrir a una arquitectura compleja de herencia.

Pero… ¿cómo hago un trait?

Bueno pues si quieres empezar a abstraer los comportamientos de tu aplicación (trabajo difícil pero que denota inteligencia) y comenzar a crear traits no te asuste que es super sencillo. Mira el siguiente ejemplo que lo vas a ver todo mucho mas claro.

¿Ves? En el trait del ejemplo podemos agrupar aquellas funcionalidades que van a ser comunes para un conjunto de clases. En este trait hemos puesto los movimientos de andar, correr y nadar. Movimientos que van a realizar todos los animales de nuestro universo y después para que estos movimientos estén disponibles en nuestros animales solo tenemos que hacer uso de la palabra reservada use dentro de la clase.

Por suerte no solo podemos usar un trait por clase sino que podemos incluir tantos traits como nos de la gana, eso si separandolos entre ellos por punto y coma y utilizando use.

Sencillo que no?

¿Pero qué pasa si en el ejemplo que he puesto, tuviéramos un método que se llamase correr dentro de la clase Animal (clase padre) y otro igual dentro del trait?

Pregunta del millón y según la lógica de la programación todo nos indica a pensar que este escenario provocaría un pete en la aplicación. Pues no.

Aquí entra en juego lo que se llama el orden de procedencia y es que los miembros, ya sean constantes o métodos heredados desde una clase base se sobrescriben cuando se inserta otro miembro que se llama igual desde un trait.

Así pues y para que lo veas claro, si tenemos un esquema de una clase padre, una clase hija y un trait con métodos que se llaman igual, la clase hija va a sobrescribir los métodos del trait que a su vez va a sobrescribir los métodos de la clase padre.

Apúntate bien esta anotación porque puede caer en examen 😛

Hablábamos antes de lo posibles petes en el orden de procedencia al utilizar métodos con el mismo nombre entre una clase padre y un trait pero existe una problemática y es que si decidimos dar el mismo nombre a dos métodos diferentes que se encuentren en dos o mas traits eso si que nos va a dar un pete y de los gordos, un error fatal siempre y cuando no lo hayamos prevenido mediante el uso de insteadof.

Aquí tienes un poquito mas de info sobre la resolución de conflictos en los traits.

Pero todavía hay un montón de cosas chulas que podemos hacer con los traits.

Origen, inception, traits que tienen traits…

Al igual que con las clases podemos definirnos una arquitectura jerárquica en nuestros traits y hacer que un trait implemente otro trait o un conjunto de traits e ir bajando en diferentes niveles de funcionalidades agrupadas.

Cuando un trait usa otro trait en su definición este puede estar formado parcial o completamente de los miembros definidos en esos otros traits.

Miembros abstractos y estáticos en los traits

No me canso de repetirlo, un trait es como una clase y por ende podemos hacer casi las mismas cosas que con las clases como por ejemplo definirnos nuestros miembros abstractos para que al utilizar el trait en una clase este le obligue a implementar los métodos que hayamos definido.

Pero también podemos utilizar y definir variables estáticas, métodos estáticos y propiedades.

A diferencia con los nombres de los métodos y el orden de procedencia, si definimos en el trait una propiedad tenemos que saber que no podemos volver a definir una propiedad con el mismo nombre en la clase que va a hacer uso del trait o de lo contrario PUM! vamos a obtener un bonito pete.

Por último y para cerrar el tema de los traits os voy a enseñar otra cosa muy chula que podemos hacer con ellos y es modificar la visibilidad de cualquier método de un trait desde la clase. Pero.. ¿cómo? Magia!

magic en los traits

Al hacer referencia a un trait en una clase mediante la palabra reservada use, podemos indicar entre corchetes el método al que queramos cambiar su visibilidad mediante el operador as.

Que tenga su utilidad, por supuesto, pero yo soy de la opinión que al igual que pasa con el casting de tipos, si tenemos que estar cambiando la visibilidad de los métodos es que tal vez no hayamos definido bien la aplicación y tengamos que darle una vuelta…

Pero es una opinión y a continuación tienes un ejemplo de esto que te acabo de contar.

Hala, pues nada chachos, a seguir estudiando programación orientada a objetos y si tenéis alguna duda hacédmela saber en los comentarios o en twitter a través del siguiente banner.

@gorkakatua #faqsGorkamu pregúntame por twitter cualquier cosa y vemos cómo lo solucionamos.

A mamarla!

¿Te ha parecido este un artículo de 5 estrellas? Dame tu valoración:
Review Date
Reviewed Item
Traits en la programación orientada a objetos
Author Rating
51star1star1star1star1star

Gorka Muñoz Andrés

Me llamo Gorka Muñoz y soy un desarrollador melómano. Combino a la perfección la búsqueda de nuevos grupos con la pasión por la tecnología. Desde chiquitito me ha gustado la programación, ahora que soy mayor estoy metido en el mundo del SEO sin olvidarme del /Dev.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *