Páginas

miércoles, 22 de diciembre de 2010

Clases y métodos abstractos en PHP.

En esta nueva entrada retomando lo que refiere a la Programación Orientada a Objetos hablaremos un poco de las clases y métodos abstractos y cómo trabajar este tipo de clases.
Una clase abstracta: Es aquella a la que no podemos acceder directamente desde ella, sino a través de sus derivados, pero la abstracción va mas allá de eso wikipedia nos indica en resumidas cuenta la abstracción se enfoca mas en que hace que en cómo se hace??. Pero como aplicamos esto a nuestras clases?? En PHP la declaración de una clase abstracta se hace mediante la palabra “abstract” seguido de la palabra “class” y nombre de la clase ejemplo:
abstract class nombreClase

Pero en que nos ayuda una clase abstracta?? Esta permite que utilicemos las características de un objeto para crear nuevos objetos a partir de esta, veámoslo con un ejemplo, suponiendo que tengamos una clase abstracta llamada animales, los atributos o características de esta nos sirven también para clases como mamíferos, o clase ovíparos ya que estos siguen siendo una derivación de los animales, veamos un ejemplo de la implementación con nuestro ejemplo:
Animales.php
abstract class animales
{
 abstract function nacer(); 
}
mamiferos.php
class mamiferos extends animales
{
 public function nacer()
 {
  echo "los mamiferos nacen del parto de la madre";
 }
}
oviparos.php
class oviparos extends animales
{
 public function nacer()
 {
  echo "los oviparos nacen de los huevos";
 }
}
Si nos fijamos la clase abstracta animal tiene un método abstracto llamado nacer, los métodos abstractos al igual que las clases son un servicio que se presta a las clases derivadas, ya que este tipo de clase no limita a una sola característica, es acá cuando vemos el “que hace” y “no como lo hace” que nos indica el autor del articulo de wikipedia, si nos fijamos nuestra clase animales tiene el método abstracto llamado nacer esto es lo que hace, como lo hace?? Esto lo declaramos en sus derivadas que en nuestro caso son mamíferos y ovíparos.
Hasta aca hemos visto un poco la implementación de las clases abstractas, pero al principio indicábamos que una clase abstracta no puede ser accedida directamente, sino a través de sus clases derivadas, entonces que pasaría si intentamos instanciar una clase abstracta??
abstract class animales
{
 abstract function nacer(); 
}

$animales = new animales();


Nos indicaría el siguiente error: “Fatal error: Cannot instantiate abstract class animales”, o que pasaría sino declaramos el método nacer en la clase ovíparos e intentamos acceder directamente al método nacer de la clase animales??

class oviparos extends animales
{
 public function comer()
 {
  /*código del metodo*/
 }
}
$oviparos = new oviparos();
$oviparos->nacer();


Nos indicaría el siguiente error “Fatal error: Class oviparos contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (animales::nacer)”

Si traducimos el error nos indica que la clase ovíparos tiene un método abstracto que debe de ser implementado o sencillamente declarar la clase abstracta.

A pesar de este error no todas los métodos de las clases abstractas deben de ser implementados, incluso hay clases abstracta en la que se declaran métodos públicos para acceder desde sus derivados un ejemplo:

Animales.php

abstract class animales
{
 abstract function nacer();
 public function fauna(){
  echo "los animales pertenecen a la fauna silvestre";
 } 
}


Ovíparos.php
require_once(“aninales.php”);
class oviparos extends animales
{
 public function nacer()
 {
  echo "los oviparos nacen de los huevos";
 }
}
$oviparos = new oviparos();
$oviparos->fauna();

si nos fijamos declaramos un método que es público para todos los animales directamente dentro de la clase abstracta, aunque no se pueda acceder a esta directamente con new animal() se puede acceder a este método sin necesidad de ser implementado en sus derivadas
Las clases abstractas nos dan uno de los principios de la Programación Orientada a Objetos (POO) que es la abstracción de los datos lo cual nos brinda una gran ayuda al momento de realizar nuestros sistemas.
Espero que este artículo sea de utilidad, cualquier corrección o sugerencia no duden en realizarla, saludos

2 comentarios:

  1. Muy bonito todo... ¿Y una aplicación real cuál seria? ¿Cuándo usaríamos estas clases abstractas? De momento me ha quedado claro que si hay que meter animales y bichos, hay que usar este tipo de clases.

    ResponderEliminar
  2. Jaja lo de los animales es solo el ejemplo mas simple con el que podemos trabajar, un ejemplo real
    https://github.com/yiisoft/yii/blob/master/framework/web/CBaseController.php

    la clase base de los controladores de YiiFramework, con como ellos mismos lo implementan,
    https://github.com/yiisoft/yii/blob/master/framework/web/CController.php#L584

    como vez los comentarios son bastante extensos y explicativos.

    Pero todo va dependiendo del diseño de software que hayas realizado en tu aplicación, saludos

    ResponderEliminar