Métodos y clases abstractos en PHP 5

  • Por
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.

Autor

Miguel Angel Álvarez

Miguel es fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Comenzó en el mundo del desarrollo web en el año 1997, transformando su hobby en su trabajo.

Compartir

Comentarios

Daniel

31/3/2009
Que buena explicacion de lo que es una clase abstracta, con ese ejemplo queda totalmenete entendido.

La verdad llegue al articulo buscando clase abstracta en php ya que he trabajado un año con java y empezaba con php, pero queria saber si al igual que java tenia interfaces, clases abstractas, polimorfismo, herencia, toString, equals, etc...

Muy bueno el articulo y el manual.

Gracias!

pedroll

27/8/2009
Métodos y clases abstractos en PHP 5
muy completo a la pagina con este tema

andres

02/10/2009
exelente!!!
Me aprece exelente el uso de los metodos abstractos, de verdad que buen ejemplo. Como programador y ultimamente como programador de objetos veo una gran necesidad de que nos den ejmplos muy contretos sobre este tema, no mas de la parte logica sino en el asunto de que sistemas usas este tipo de metodologias, como es el caso de drupal o joomla o wordpres. De hay que podriamos entender ya en codigo la importancia de estos metodos.

Matias

01/7/2010
Exelente!
Muchas gracias por esta explicacion ... me sirvio de mucho dado que no entendia bien este concepto. Gracias!!!

Maikel

21/10/2010
Malos conceptos
"Una clase abstracta es la que tiene métodos abstractos."

No es cierto, una clase abstracta no solo tiene métodos abstractos como sugieres en la introducción del artículo. Puede tener métodos y propiedades como cualquier otra clase.

"Las clases que incorporan métodos abstractos se deben declarar como abstractas. "

Tampoco es cierto, no es necesario declarar como abstracta la clase. La única obligación cuando hay métodos abstracto en una clase, es que sus clases hijas (quienes heredan la clase) deben (MUST) implementar los métodos abstractos.

BlaBlaBla

03/3/2011
A Maikel
@Maikel te equivocas, los métodos abstractos solo pueden estar en clases abstractas, las clases concretas no pueden contener métodos abstractos, haz la prueba y nos cuentas.

mrz

07/4/2011
:D
gracias por la explicacion me kedo muy claro lo que es una clase abstracta
ahora podre explicarselo a mis compañeros gracias!!!

Jorge G.

17/6/2011
Clase Abstracta
Clase abstracta: una clase abstracta no puede ser instanciada puesto que no tiene sentido
crear un objeto con funciones que no hacen nada, estas clases se defines para ser heredadas
por otras clases en las cuales se tiene por regla que implementar los metodos abstractos declarados en la clase abstracta.
Una clase abstracta ademas de los metodos declarados como abstractos puede contener propiedades y metodos
normales como cualquier otra clase.
Para declarar un metodo abstracto debemos hacerlo dentro de una clase abstracta.

Albert

17/2/2013
Explicación
Estoy siguiendo con atención los capítulos y las explicaciones son magníficas. Gracias por el aporte.