Zumbe.net

Trabajar con clases y objetos en PHP

Programacion orientada a objetosEste 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.

Código (php)
  1. // Defino al usuario
  2. $usuario[‘nombre’] = "Jose";
  3. $usuario[‘apellido’] = "Cabo";
  4. $usuario[‘aficion’] = "Linux";
  5. $usuario[’suscripcion’] = true;
  6. $usuario[‘mail’] = ‘josecabo@example.com’;
  7.  
  8. //creo algunas funciones
  9. function config_usuario($clave,$valor)
  10. {
  11.         global $usuario;
  12.         $usuario[$clave] = $valor;
  13. }
  14. function procesa_usuario($usuario)
  15. {
  16.         echo "<p>Informacion del usuario $usuario[nombre] $usuario[apellido]</p>";
  17.         foreach($usuario as $clave=>$valor)
  18.         {
  19.                 echo "<p><strong>",$clave,"</strong> = ",$valor,"</p>";
  20.         }
  21. }
  22. function cuenta_propiedades($usuario)
  23. {
  24.         echo "<p>El usuario tiene ",count($usuario)," propiedades definidas.</p>";
  25. }
  26.  
  27. // Ahora comienza la ejecucion del programa
  28.  
  29. if($_GET) // si he recibido variables por get
  30. {
  31.         // aumento la configuracion del usuario con estas variables
  32.         foreach($_GET as $c=>$v)
  33.         config_usuario($c,$v);
  34. }
  35. cuenta_propiedades($usuario);
  36. 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:

Código (php)
  1. // Defino la clase
  2. class NombreClase {
  3.         var $variable; // esta es una variable propia de la clase
  4.         function funcion($var1,$var2) // esta es una funcion propia de la clase
  5.         {
  6.                 // .. contenido de la funcion …
  7.         }
  8. }

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:

Código (php)
  1. // instancio un nuevo objeto
  2. $miObjeto = new NombreClase;
  3. // adjudico a la variable interne un array
  4. $miObjeto->variable = ‘valor’;
  5. // ejecuto la función interna
  6. $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.

Código (php)
  1. // Defino la clase Usuario
  2. class Usuario {
  3.         var $datos; // inicializo los datos del usuario
  4.         var $nombre; // inicializo la variable que contiene el nombre
  5.         var $formato; // el formato de salida, puede ser "p" o "ul"
  6.         function Usuario($nombre) //función constructor, se ejecuta automaticamente
  7.         {
  8.                 $this->datos[‘nombre’] = $nombre;
  9.                 $this->nombre = $nombre;
  10.                 $this->formato = ‘p’; //por defecto es p
  11.         }
  12.         function dato($clave,$valor)
  13.         {
  14.                 $this->datos[$clave] = $valor; //almacena un nuevo dato
  15.         }
  16.         function procesa()
  17.         {
  18.                 echo "<p>Informacion del usuario ",$this->nombre,"</p>";
  19.                 if($this->formato == ‘ul’) echo ‘<ul>’; //si el formato es de lista…
  20.                 foreach($this->datos as $c=>$v)
  21.                 {
  22.                         $outp = "<strong>".$c."</strong> = ".$v;
  23.  
  24.                         if($this->formato == ‘p’) echo ‘<p>’,$outp,‘</p>’ ; //formato de parrafo
  25.                         else echo ‘<li>’,$outp,‘</li>’; // formato de lista
  26.                 }
  27.         }
  28.         function cantidad()
  29.         {
  30.                 echo "<p>El usuario",$this->nombre," tiene ",count($this->datos)," propiedades definidas.</p>";
  31.         }
  32. }
  33. // ahora instancio tres objetos con la clase Usuario
  34. $david = new Usuario(‘David’);
  35. $rosa = new Usuario(‘Rosa’);
  36. $carlos = new Usuario(‘Carlos’);
  37. //voy a completar un poco sus perfiles
  38. $david->dato(‘apellido’,‘Perez’);
  39. $david->dato(‘mail’,‘davidper@blox.xi’);
  40. $david->dato(‘aficion’,‘Mariposes’);
  41.  
  42. $rosa->dato(‘apellido’,‘Fernandez’);
  43. $rosa->dato(‘coche’,‘Diesel’);
  44.  
  45. $carlos->dato(‘apellido’,‘Gomez’);
  46. $carlos->dato(’sistema_operativo’,‘Linux’);
  47. $carlos->dato(‘dioptrias’,‘2.5(Miopia)’);
  48. $carlos->dato(‘pais’,‘Brasil’);
  49.  
  50. // Ahora voy a mostrar solo el perfil de carlos, con formato ‘ul’
  51. $carlos->cantidad(); //primero digo cuanta informacion tiene
  52. $carlos->formato = ‘ul’; // le digo que quiero formato ul
  53. $carlos->procesa(); // proceso el output

Ver resultado

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

5 Comentarios para “Trabajar con clases y objetos en PHP”

  1. Tolito Ha dicho:
    22 de Agosto del 2007 a las 7:28

    Hace un mes hice un curso de php5 y la verdad es que esta nueva versión ha mejorado mucho la programación orientada a objetos, aunque aún le faltan algunas cosillas…pero bueno.

    Una de las cosas que me gusto de la POO del nuevo PHP5 fue el __autoload, es una función que es llamada cuando no encuentra la definición de una clase y la busca donde le digamos, aquí dejo la documentación de esta maravilla que ahorra muchos includes: http://es2.php.net/autoload

    Ej:

    function __autoload($class_name) {
    require_once $class_name . ‘.php’;
    }

    Si no encuentra la definicion de la clase “cosas”, entra en esta funcion y automaticamente hace un:

    require_once (”cosas.php”);

    Un saludo

  2. Alex Barros Ha dicho:
    22 de Agosto del 2007 a las 16:44

    Genial! Realmente interesante.

    La verdad es que no he querido profundizar en el tema de clases y objetos, porque podríamos estar aquí todo el año. PHP está lleno de sorpresas!

  3. gafeman Ha dicho:
    23 de Agosto del 2007 a las 1:09

    hablando de clases… encontre esta web, donde te enseñan hacer que tus clases sean compatibles tanto con php 4 y 5

    http://chisflorinel.blogspot.com/2005/08/php-4-constructor-and-destructor.html

    ya que son bastantes los servidores que aun tienen instalado php 4

  4. Alex Barros Ha dicho:
    23 de Agosto del 2007 a las 2:08

    Muchas gracias por el dato. Mi host es uno de los que usan PHP4, un día de estos les tengo que contactar, porque el soporte para 4 caduca dentro de poco!

  5. Tolito Ha dicho:
    23 de Agosto del 2007 a las 6:06

    El problema es que si te adaptas a php4 eso ni es POO ni es nada…es solo una chapuza monumental a medias entre la POO y la Programación estructurada.

Deja un comentario

Zumbe.net es administrado por WordPress
Puedes suscribirte a las Entradas (RSS) o los Comentarios (RSS).
Esta obra se encuentra bajo una licencia de Creative Commons.