¿Herencia múltiple en PHP 5.4?

La herencia es uno de los elementos clave de la programación orientada a objetos. Existen la herencia múltiple, herencia simple y la herencia horizontal, dependiendo del número de clases que una clase puede heredar o incluir. La herencia simple es la más sencilla y legible, pero restrictiva. La herencia múltiple en cambio es compleja, pero permite una definición más natural de las relaciones entre las clases. La herencia horizontal es un nuevo concepto introducido con PHP 5.4, a mi entender un parche, que permite a este lenguaje de herencia simple reutilizar código.

tufail

Los lenguajes de programación orientados a objetos nos proporcionan, a parte de naturalidad al escribir código, la reutilización del mismo; de ahí que una de las principales ventajas sea el concepto de herencia. A través de la herencia podemos crear clases padres que contienen la funcionalidad básica, y luego una nueva clase que extienda a esta donde heredaremos todas sus características, propiedades y métodos. Sin embargo, como se ha visto en varias ocasiones en este blog, en PHP sólo se puede heredar de una sola clase lo que significa que si deseas utilizar la funcionalidad de una clase adicional prácticamente tus únicas opciones son copiar y pegar o usar includes u otras cosas por el estilo.

Para palear de una forma esto, en PHP 5.4, se introduce el concepto de rasgos (Traits). Estas características, o rasgos, nos permiten compartir la funcionalidad de múltiples ‘clases’ sin tener que extenderlas. Este concepto es el que se denomina herencia horizontal.

Ventajas de utilizar rasgos

  1. Reutilización de códigos ya programados.

Deficiencias de los rasgos sobre la herencia múltiple (traits vs MI)

  1. Los rasgos no son clases propiamente dichas, no se puede crear una instancia de un rasgo.
  2. La planificación de las clases y los rasgos debe ser mucho más cuidadosa porque se deben escoger muy cuidadosamente las partes del código que serán comunes a varias clases y que se pueden considerar como rasgos y no clases propiamente dichas.

Diferencias entre los rasgos y las interfaces

  1. Un rasgo conlleva a que los métodos dentro de él estén implementados mientras que en las interfaces lo único que aseguramos es que las clases que la implementen deben implementar el contenido de estas funciones o declararlas abstractas.

Al principio de este post comentaba que para mi la herencia horizontal es un parche para simular, malamente, la herencia múltiple y lo defiendo al decir que todos los problemas asociados a la herencia múltiple (multiple inherence) se plantean en la herencia horizontal: implementación de métodos duplicados, complejidad, ambigüedad, en resumen los conocidos como problema del diamante.

Es un paso de avance, no lo pongo en duda, pero siendo como soy un defensor de la herencia múltiple no me parece del todo acertado decantar el lenguaje PHP por la herencia horizontal en vez de múltiple. ¿Alguien con argumentos que me pueda defender una frente a la otra?

Comentarios