> Manuales > Orientación a objetos con PHP

Conoceremos lo que es una clase abstracta y los métodos abstractos. Cómo se definen y en qué situaciones se deben utilizar.

Una clase abstracta es la que tiene métodos abstractos. Los métodos abstractos son los que están declarados en una clase, pero no se ha definido en la clase el código de esos métodos.

Esa puede ser una buena definición de clases y métodos abstractos, pero veamos con calma una explicación un poco más detallada y comprensible por todos.

En ocasiones, en un sistema de herencia como el de la programación orientada a objetos (POO), tenemos entidades que declarar aunque no se puede dar su definición todavía, simplemente las deseamos definir por encima para empezar una jerarquía de clases.

Pensemos en los productos lácteos (los derivados de la leche). No cabe duda que los productos lácteos son una gran familia. Incluyen a los yogures, mantequillas, quesos, helados e incluso a la propia leche. Sin embargo, los productos lácteos en si no se encuentran en la vida real. En el supermercado no te venden un producto lácteo en general. Por ejemplo, nadie compra un kilo de producto lácteo... más bien preguntarán por un litro de leche, un litro de helado o un pack de yogures.

Todos los productos lácteos tienen algunas características comunes, como el porcentaje en leche o la fecha de caducidad. También tienen algunas funcionalidades comunes como conservarse o consumirse. Sin embargo, la manera de conservarse es distinta dependiendo del producto lácteo. La leche se conserva fuera de la nevera, mientras que no esté abierto el brick, y los yogures deben conservarse en la nevera en todo momento. Los quesos se conservan en la nevera, pero metidos dentro de un recipiente por si acaso desprenden olores fuertes. Por lo que respecta a los helados, se deben conservar en el congelador, siempre que deseemos que no se conviertan en líquido. Al consumir un producto lácteo la cosa también cambia, puesto que el queso se suele acompañar con pan o tostadas, la leche se bebe y el helado se toma con cuchara.

En definitiva, a donde queremos demostrar es que podemos tener un conjunto de objetos que tienen unas características comunes y funcionalidades, también comunes, pero que difieren en la manera de llevarlas a cabo. Para esto está la abstracción.

La clase de los productos lácteos, tendrá una serie de propiedades y unos métodos abstractos. Los métodos abstractos, como habíamos adelantado, son aquellos que no incluyen una codificación, sino que simplemente se declaran, dejando para las clases que hereden la tarea de codificarlos.

En este caso, la clase producto lácteo tendrá los métodos abstractos conservarse() y consumirse(), pero no se especificará el código fuente de estos métodos (por eso son abstractos). Las clases que hereden de producto lácteo serán las encargadas de definir un código para los métodos definidos como abstractos en la clase padre. Así, cada clase que herede de producto lácteo, deberá especificar el mecanismo concreto y específico por el cual se van a conservar o consumir.

Las clases que incorporan métodos abstractos se deben declarar como abstractas. Es una condición forzosa. Las clases abstractas no se pueden instanciar. Es decir, no podemos crear objetos a partir de ellas. Es algo lógico. Pensemos en los productos lácteos, estos no existen más que como una idea general. Sólo podremos encontrar productos lácteos de un tipo en concreto, como leche o yogur, pero no la idea de producto lácteo en general.

Una clase que herede de un producto lácteo debe definir los métodos abstractos declarados en la clase abstracta. De lo contrario, la clase que hereda estaría obligada a declararse como abstracta.

En nuestro ejemplo de videoclub, tratado a lo largo de los distintos capítulos del manual de PHP 5, tenemos una clase que también sería un buen ejemplo de clase abstracta. Se trata de la clase soporte. De esta clase heredaban los distintos productos del videoclub, como películas en DVD, cintas de vídeo o juegos. No hubiera sido mala idea declarar como abstracta la clase soporte, dado que no se van a utilizar, ni existen, soportes en general, sino que lo que existen son los distintos soportes concretos.

La sintaxis de la abstracción

Para declarar clases y métodos abstractos se utiliza la siguiente sintaxis.

abstract class nombre_clase{ 

  //propiedades 
public x; 
  private y; 

  //métodos 

  public function __construct(){ 
   … 
  } 

  public abstract function nombre_metodo(); 

}

Nos fijamos que se utiliza la palabra clave "abstract" para definir las clases o métodos abstractos. Además, los métodos abstractos no llevan ningún código asociado, ni siquiera las llaves para abrir y cerrar el método.

Miguel Angel Alvarez

Miguel es fundador de DesarrolloWeb.com y la plataforma de formación online Escu...

Manual