Definción y uso de clases en PHP

PHP no es un lenguaje explícitamente orientado a objetos, si bien es cierto que está preparado para aprovechar una serie de aspectos de las clases que son interesantes y recomendables en el desarrollo de aplicaciones. En este artículo se verá cómo hacer uso de clases en PHP de una forma cómoda y sin lugar a errores.

¿Qué es una clase?

La mayoría de lenguajes de programación modernos están orientados a objetos. El concepto de orientación a objetos es una técnica que acerca la programación a la forma de pensar humana. Podemos pensar en cualquier aspecto de la vida real como un sistema basado en objetos: un coche, un bolígrafo, un libro, una silla, o incluso una persona. Todos estos pueden ser objetos con una serie de características y una serie de capacidades. Por ejemplo, un coche tiene un número de puertas determinado, un color, un tamaño… y es capaz de realizar tareas como arrancar, acelerar, frenar… Lo mismo sucede con una persona: tiene una estatura, un peso, un color de ojos y muchísimas características que la hacen única frente a las demás.

Siguiendo con el ejemplo, cuando uno va por la calle es capaz de distinguir fácilmente a los seres humanos de otro tipo de elementos, como los coches. ¿Por qué esto es así? Porque todos tenemos en la mente la idea de un ser humano, su molde, las características que tiene que cumplir una entidad para poder identificarse como un ser humano y no como un coche.

Este concepto que parece tan evidente es la base de la programación orientada a objetos. En el ejemplo, la idea mental que tenemos de un ser humano sería una clase, mientras que cada persona sería una representación física real de esa idea de ser humano, en términos de programación cada persona sería una instancia de esa clase.

En resumen, una clase es una idea de un objeto que tiene sus carácterísticas, que a partir de ahora llamaremos propiedades, y sus habilidades, su capacidad de realizar ciertas acciones, que en programación llamaremos métodos. La clase coche, por ejemplo, podría tener como propiedades el color, las puertas, el tamaño, la marca, el modelo, la velocidad máxima, y como métodos las acciones de cambiar de marcha, acelerar, frenar, abrir el capó, bloquear las puertas.

Un ejemplo del uso de clases

Pensemos en una aplicación que gestione los datos de los pacientes de una consulta médica, de forma que en cada visita el médico pueda ver el historial del paciente. Una opción recomendable para desarrollar este tipo de aplicación sería crear una clase llamada Paciente y dotarla de propiedades como la edad, el sexo, el peso, la estatura, el número de identificación y las observaciones. Podríamos ampliar la aplicación creando una clase llamada Visita con propiedades como fecha, hora y causa, y otra clase, por ejemplo, llamada Análisis que podríamos preparar para representar los resultados.

Todas estas clases podrían ir entrelazadas desde los métodos. Por ejemplo, la clase Paciente podría tener un método llamado nueva_visita que creara una nueva instancia de la clase Visita y esta a su vez podría tener un método llamada nuevo_analisis, que se aplicaría cuando el médico diese la orden a un paciente de hacerse un Análisis.

La programación orientada a objetos comporta una serie de ventajas como la reutilización de código, la mejor comprensión, la flexibilidad, la capacidad de hacer extensible una aplicación, la mejor división de las tareas… En el ejemplo podríamos extender la aplicación símplemente creando nuevas propiedades a la clase Paciente, podríamos dividir sin problemas el trabajo a realizar entre varias personas, podríamos utiilzar código de otras aplicaciones…

Sintaxis de clases en PHP

La programación orientada a objetos, aparte de las clases, se basa en más conceptos como la herencia, las interfaces, el polimorfismo… algunos de los cuales todavía no se implementan en la versión actual de PHP. La sintaxis básica de una clase en PHP es la siguiente.

<?php
class nombre_clase {
var $propiedad_1;
var $propiedad_2;
var $propiedad_3;

function método_1($parametro) {
  instrucciones_del_método;
}
}
?>

Una vez definida la clase, que es el molde del objeto, se pueden crear instancias a partir de ella. En PHP se hace de la siguiente forma.

<?php
$nombre_instancia = new nombre_clase($parametros);
?>

Una clase en cada archivo

En PHP no hay una forma establecida de organizar las clases. Una buena forma de hacerlo es escribiendo cada clase en un archivo distinto, de forma que a simple vista y sin tener que ver el contenido se pueda saber dónde está cada una. Para poder hacer uso de esa clase, es decir, para poder crear instancias de ella hay que hacer que su definición se incluya, esté presente, en el archivo donde se cree su instancia.

<?php
include("clases/class_persona.php");
$luis=new Persona();
?>

Sin la instrucción del include, que sustituye esa instrucción por el contenido de class_persona.php, no se podría crear una instancia de la clase Persona, ya que la aplicación no encontraría su definición en ningún sitio.

La única restricción del lenguaje, bastante lógica, es que no se puede definir una clase dos veces, error en el que se puede caer símplemente haciendo más de una llamada o inclusión al archivo de la clase. De esta forma no se puede hacer una llamada al archivo que contiene la definición de la clase cada vez que se quiera usarla, porque corremos el riesgo de, si tenemos un árbol de archivos algo complejo, hacer dos veces el include y generar un error.

Una posible solución es hacer uso de la función include_once que previene este tipo de situaciones. Incluye el archivo pasado por parámetro únicamente si antes no se ha incluido. Si por el contrario detecta que ya se ha hecho una llamada no la vuelve a hacer. La sintaxis es la misma.

<?php
include_once("clases/class_persona.php");
?>

Inclusión automática

Partiendo del include_once se puede hilar más fino y en base a ciertas capacidades de PHP generar un código que guardado en un archivo incluya todas las clases de golpe y porrazo, haciendo que nos despreocupemos de los includes. Se trata de programar un script en PHP que lea todos los archivos de un directorio, y realice una acción con cada uno de ellos. En este caso la acción a realizar es un include_once.

De esa forma, automáticamente, sólo colocando la clase en el directorio de clases se puede incluir en un mismo archivo junto con todas las demás.

<?php
$dir=opendir("./class");
while ($archivo=readdir($dir))
if ($archivo!="." && $archivo!=".." && $archivo!="clases.php")
include_once($archivo);
closedir($dir);
?>

Paso a paso, este código abre el directorio situado en la ruta ./class, lee el listado de archivos que hay dentro, y hace un include_once a cada archivo que se encuentra, exceptuando clases.php, que es en el que se colocan estas líneas. Con esto se consigue que en cada página de la aplicación sólo tengamos que hacer un include al archivo clases.php para que se pueda usar cualquier clase definida en el directorio.

<?php
include("class/clases.php");
?>

Herencia

La herencia es un concepto de la programación orientada a objetos, con el que una clase puede heredar todas las propiedades y los métodos de otra y además añadir los suyos propios. Por ejemplo, tanto la clase Gato y la clase Tigre podrían heredar el contenido de la clase Mamífero y además tener características propias.

PHP también está preparado para trabajar con la herencia de clases. El problema surge al usar el sistema automático para incluirlas. Una clase no puede heredar las características de otra, si no existe una definición previa de esa misma, como es lógico. Por tanto, es probable que el código anterior reporte un error de ese tipo.

La solución está de nuevo en el include_once. Básicamente se trata de asegurarnos de que cuando una clase vaya a recibir la herencia de otra, esa segunda clase ya se haya incluído en el archivo. Esto se consigue haciendo la llamada a la clase padre desde el archivo de la clase hijo que va a heredar las características.

<?php
include_once("class_padre.php");

class hijo extends padre {
var $propiedad_1;
var $propiedad_2;

function método_1($parametro) {
instruccion_del_método;
}
}
?>

Artículo escrito por: Joaquín Martí García

Deja un comentario