Trabajar con clases y objetos en PHP
Este verano comencé a orientar todos mis scripts a Objetos. Esta metodología es muy recomendada para cualquier proyecto con más de 100 líneas de código. Te permite agrupar en entidades tus herramientas de trabajo, de esta forma tu código es fácilmente reutilizable, mucho más comprensible, y mejor estructurado.
Voy a tratar de explicaros en qué consiste, y cómo programar clases y objetos en el lenguaje PHP. Advierto que muchas veces este concepto es complicado; a mí me costó mucho comprenderlo, y lo hice gracias a JavaScript y MooTools, que tiene un mejor soporte de objetos.
En la programación estructurada (la de toda la vida) teníamos una serie de variables, y una serie de funciones, una detrás de otra. Entre todas ellas, definíamos un orden de ejecución en el que las variables van tomando valores, las funciones se van ejecutando y se va imprimiendo texto por pantalla.
Vamos a crear un caso hipotético de programación, resuelto con programación estructurada.
-
// Defino al usuario
-
$usuario[‘nombre’] = "Jose";
-
$usuario[‘apellido’] = "Cabo";
-
$usuario[‘aficion’] = "Linux";
-
$usuario[’suscripcion’] = true;
-
$usuario[‘mail’] = ‘josecabo@example.com’;
-
-
//creo algunas funciones
-
function config_usuario($clave,$valor)
-
{
-
global $usuario;
-
$usuario[$clave] = $valor;
-
}
-
function procesa_usuario($usuario)
-
{
-
echo "<p>Informacion del usuario $usuario[nombre] $usuario[apellido]</p>";
-
foreach($usuario as $clave=>$valor)
-
{
-
}
-
}
-
function cuenta_propiedades($usuario)
-
{
-
}
-
-
// Ahora comienza la ejecucion del programa
-
-
if($_GET) // si he recibido variables por get
-
{
-
// aumento la configuracion del usuario con estas variables
-
foreach($_GET as $c=>$v)
-
config_usuario($c,$v);
-
}
-
cuenta_propiedades($usuario);
-
procesa_usuario($usuario);
Como vemos al ejecutar el script en esta URL …/procesoUsuario.php?poblacion=Valencia&aficion=Ubuntu El programa responde satisfactoriamente, modificando la información del usuario, y mostrándola por pantalla.
Afortunadamente se trata de un programa muy corto, porque mediante este procedimiento los códigos acaban haciéndose inaccesibles (especialmente si no estan bien comentados).
Programando en POO, lo primero que tendríamos que hacer es definir la clase usuario, porque en la programación orientada a objetos, lo que realmente progamamos son clases. Después los objetos adoptarán la forma de la clase, pero esto lo veremos ahora enseguida.
La sintaxis para crear una nueva clase en PHP es la siguiente:
-
// Defino la clase
-
class NombreClase {
-
var $variable; // esta es una variable propia de la clase
-
function funcion($var1,$var2) // esta es una funcion propia de la clase
-
{
-
// .. contenido de la funcion …
-
}
-
}
En el anterior código hemos creado una clase llamada NombreClase, con la variable interna $variable y la función funcion que admite dos parámetros. Esta sería la estructura, el caparazón de lo que luego serán los objetos. Es decir, un objeto que provenga de esta clase contendrá en su interior una variable y una función, que son las definidas por la clase.
Para ilustrarlo, vamos a ver un objeto que provenga de la anterior clase:
-
// instancio un nuevo objeto
-
$miObjeto = new NombreClase;
-
// adjudico a la variable interne un array
-
$miObjeto->variable = ‘valor’;
-
// ejecuto la función interna
-
$miObjeto->funcion(‘x’,‘y’);
Ahora toca aprender un par de convenciones de las clases de PHP. Existe una función que se denomina constructor, que tiene el mismo nombre que su clase, y que se ejecutará nada más crear un objeto, automáticamente. También hay que destacar que para referirse a variables o funciones dentro de una misma clase, se usa $this->nombre_variable y $this->nombre_funcion.
Sabido todo esto, estamos en disposición de crear nuestra clase Usuario, que administrará a los usuarios de nuestra fictícia aplicación.
-
// Defino la clase Usuario
-
class Usuario {
-
var $datos; // inicializo los datos del usuario
-
var $nombre; // inicializo la variable que contiene el nombre
-
var $formato; // el formato de salida, puede ser "p" o "ul"
-
function Usuario($nombre) //función constructor, se ejecuta automaticamente
-
{
-
$this->datos[‘nombre’] = $nombre;
-
$this->nombre = $nombre;
-
$this->formato = ‘p’; //por defecto es p
-
}
-
function dato($clave,$valor)
-
{
-
$this->datos[$clave] = $valor; //almacena un nuevo dato
-
}
-
function procesa()
-
{
-
foreach($this->datos as $c=>$v)
-
{
-
$outp = "<strong>".$c."</strong> = ".$v;
-
-
}
-
}
-
function cantidad()
-
{
-
}
-
}
-
// ahora instancio tres objetos con la clase Usuario
-
$david = new Usuario(‘David’);
-
$rosa = new Usuario(‘Rosa’);
-
$carlos = new Usuario(‘Carlos’);
-
//voy a completar un poco sus perfiles
-
$david->dato(‘apellido’,‘Perez’);
-
$david->dato(‘mail’,‘davidper@blox.xi’);
-
$david->dato(‘aficion’,‘Mariposes’);
-
-
$rosa->dato(‘apellido’,‘Fernandez’);
-
$rosa->dato(‘coche’,‘Diesel’);
-
-
$carlos->dato(‘apellido’,‘Gomez’);
-
$carlos->dato(’sistema_operativo’,‘Linux’);
-
$carlos->dato(‘dioptrias’,‘2.5(Miopia)’);
-
$carlos->dato(‘pais’,‘Brasil’);
-
-
// Ahora voy a mostrar solo el perfil de carlos, con formato ‘ul’
-
$carlos->cantidad(); //primero digo cuanta informacion tiene
-
$carlos->formato = ‘ul’; // le digo que quiero formato ul
-
$carlos->procesa(); // proceso el output
Como podemos ver, a la hora de preparar el código, se nos muestra más agradable y lógico para la mente humana, agrupando todas las acciones (métodos) de los usuarios en una misma clase. Además, hemos podido crear tres usuarios distintos, que comparten el mismo funcionamiento y la misma estructura.
Si os interesa este tema, os recomiendo que miréis tutoriales por internet, porque es un tema apasionante.
Parece ser que el siguiente paso es la Programación Orientada a Aspectos. Esa todabía no la entiendo… :S
5 comentarios | tags: Código, General