Herencia múltiple en PHP

Aunque el título suene atractivo, PHP no ha incorporado la herencia múltiple como tampoco lo hace Java pero si que desde la versión >= 5.4 incorpora un mecanismo llamado Traits que simularía la herencia múltiple de clases. Los Traits son usa especie de clases cuya misión es agrupar funcionalidades comunes. Este tipo de clases no se puede instanciar directamente sino que se emplea en una clases. Ejemplo:


trait base1 {

  function metodo1(){ return 'metodo1'; }

  function metodo2(){ return 'metodo2' }

}

class base2 {

  function metodo1(){ return 'base2:metodo1' }

}

class miClase extends base2 {

  use base1;

}

Mediante la palabra reservada use, incorporamos la funcionalidad contenida en el trait base1 y mediante extends incorporamos la funcionalidad de base2. Como vereis, base1 y base2 comparten nombres de métodos comunes. Para solventar conflictos, existe una precedencia: Miembros de clase actual -> miembros del trait -> miembros heredades (extends), es decir, los miembros de miClase tienen precedencia sobre los de base1 y base1 tiene precedencia sobre los de base2.

Insertar multiples traits es muy sencillo:

use traitClass1, traitClass2, traitClassN

Resolución de conflictos entre Traits

En algunas ocasiones varios traits comparten nombres de métodos y si el conflicto no se resuelve genera un error fatal. Para resolver un conflicto disponemos de los operadores as e insteadof.

trait base1 {

  function metodo1(){ return 'metodo1'; }

  function metodo2(){ return 'metodo2' }

}

trait base2 {

  function metodo1(){ return 'base2:metodo1'; }

  function metodo2(){ return 'base2:metodo2' }

}
use base1, base2 {
base1::metodo2 insteadof base2;
base2::metodo1 insteadof base1;
}

No es la herencia múltiple de Python pero no está mal la aproximación. Preferiría que en futuras versiones resolviesen los conflictos de una manera más transparente con algún tipo de convención.

1 comentario

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: