> Manuales > Orientación a objetos con PHP

Para afianzar los conocimientos sobre programación orientada a objetos vamos a concluir por ahora la creación de nuestro videoclub con PHP5.

Para continuar la creación del videoclub y las explicaciones sobre la programación orientada a objetos (POO), vamos a programar la clase principal, que engloba a todas las clases que hemos ido creando hasta el momento. La clase principal se llama videoclub y modela el comportamiento general del videoclub.

Llegado este punto sería bueno que remarcar dos cosas sobre el desarrollo de programas orientados a objetos.

  1. La clase principal de un sistema que deseamos modelar en POO se suele llamar como el propio sistema que estamos modelando. Por ejemplo, si estuviéramos creando una biblioteca, la clase principal se llamaría biblioteca. En este caso, que estamos haciendo un videoclub, la clase principal se llamará videoclub.
  2. El proceso de creación de un programa POO se realiza al revés de como hemos hecho en este manual, empezando el desarrollo de la clase general y finalizando por las clases más específicas. De este modo, al crear la clase general, podemos ir viendo qué otros objetos necesitaremos, cuáles serán sus métodos y propiedades. En este manual lo hemos hecho al revés porque nos venía bien para ir describiendo las características de la POO.

La clase videoclub tendrá como propiedades a los soportes en alquiler (películas o juegos) y por otra parte, los socios o clientes que alquilan los productos. Los métodos de la clase videoclub serán la inclusión y listado de soportes en alquiler y de socios, el alquiler de soportes por parte de clientes.

Nota: Ni que decir tiene que el videoclub que estamos creando está simplificado al máximo. Está claro que si estuviésemos creando un videoclub con el propósito de utilizarlo en producción, habría que pensar y desarrollar muchas otras funcionalidades.

Vamos ya con el código y sus explicaciones.

Atributos de la clase videoclub

public $nombre; 
private $productos; 
private $num_productos; 
private $socios; 
private $num_socios;

El atributo $productos será un array con los distintos soportes en alquiler. $num_productos lo utilizaremos para llevar la cuenta del número de productos que tenemos disponibles. De modo similar, $socios será un array de clientes y $num_socios llevará la cuenta de los socios que tenemos dados de alta. Aparte, nuestro videoclub tendrá un nombre, que almacenaremos en la variable $nombre.

Constructor

function __construct($nombre){ 
   $this->nombre=$nombre; 
   $this->productos=array(); 
   $this->num_productos=0; 
   $this->socios=array(); 
   $this->num_socios=0; 
}

Este método inicializará los atributos del objeto que se está construyendo. Recibe únicamente el nombre del videoclub. Como tareas destacables están las inicializaciones de los arrays de productos y socios y la puesta a cero de los contadores que vamos a utilizar.

Método incluir_producto()

private function incluir_producto($nuevo_producto){ 
   $this->productos[$this->num_productos]=$nuevo_producto; 
   echo "<p>Incluido soporte " . $this->num_productos; 
   $this->num_productos++; 
}

Este método ha sido declarado como private, porque sólo queremos que se llame desde dentro de la clase. Recibe el nuevo producto que se quiere dar de alta y lo guardar en el array de productos, en la posición marcada por el atributo num_productos. Luego muestra un mensaje por pantalla y por último incrementa a uno el atributo num_productos.

Métodos incluir_dvd(),incluir_cinta_video() e incluir_juego()

Los tres siguientes métodos que vamos a ver, instancian los tres productos con los que trabaja el videoclub y luego los introducen en array de productos llamando a incluir_producto().

function incluir_dvd($tit,$precio,$idiomas,$pantalla){ 
   $dvd_nuevo = new dvd($tit, $this->num_productos, $precio, $idiomas, $pantalla); 
   $this->incluir_producto($dvd_nuevo); 
} 

function incluir_cinta_video($tit,$precio,$duracion){ 
   $cinta_video_nueva = new cinta_video($tit, $this->num_productos, $precio, $duracion); 
   $this->incluir_producto($cinta_video_nueva); 
} 

function incluir_juego($tit,$precio,$consola,$min_j,$max_j){ 
   $juego_nuevo = new juego($tit, $this->num_productos, $precio, $consola, $min_j, $max_j); 
   $this->incluir_producto($juego_nuevo); 
}

Podemos fijarnos que el número de identificación del soporte, que recibe el constructor de las cintas de vídeo, DVDs o juegos, lo generamos por medio del atributo de la clase de videclub num_productos, que guarda el número de productos dados de alta.

Método incluir_socio()

Este método hace las tareas de instanciación del socio nuevo y su inclusión en el array de socios.

function incluir_socio($nombre,$max_alquiler_concurrente=3){ 
   $socio_nuevo = new cliente($nombre,$this->num_socios,$max_alquiler_concurrente); 
   $this->socios[$this->num_socios]=$socio_nuevo; 
   echo "<p>Incluido socio " . $this->num_socios; 
   $this->num_socios++; 
}

Reciben los datos del nuevo socio: nombre y el máximo número de películas que puede alquilar (siendo 3 el valor por defecto). Una vez instanciado el nuevo socio, lo introduce en el array, en la posición marcada por el atributo num_socios. Luego muestran un mensaje por pantalla y por último incrementan a uno los atributos num_productos o num_socios.

El número de socio, que recibe entre otros parámetros, el constructor de la clase socio lo generamos por medio del contador de socios num_socios, de la clase videclub.

Métodos listar_productos() y listar_socios()

Dos métodos muy similares, que veremos de una sola vez.

function listar_productos(){ 
   echo "<p>Listado de los " . $this->num_productos . " productos disponibles:"; 
   for ($i=0;$i<$this->num_productos;$i++){ 
      echo "<p>"; 
      $this->productos[$i]->imprime_caracteristicas(); 
   } 
} 

function listar_socios(){ 
   echo "<p>Listado de $this->num_socios socios del videoclub:"; 
   for ($i=0;$i<$this->num_socios;$i++){ 
      echo "<p>"; 
      $this->socios[$i]->imprime_caracteristicas(); 
   } 
}

Estos métodos imprimen un listado completo de los socios y productos dados de alta. Simplemente hacen un recorrido del array de productos o de socios y van imprimiendo sus características.

Método alquila_a_socio()

Realiza las acciones necesarias para alquiler un producto a un socio.

function alquila_a_socio($numero_socio,$numero_producto){ 
   if (is_null($this->socios[$numero_socio])){ 
      echo "<p>No existe ese socio"; 
   }elseif(is_null($this->productos[$numero_producto])){ 
      echo "<p>No existe ese soporte"; 
   }else{ 
      $this->socios[$numero_socio]->alquila($this->productos[$numero_producto]); 
   } 
}

Este método recibe el identificador del socio y del producto en alquiler. Antes de proceder, realiza un par de comprobaciones. La primera para ver si existe un socio con el número de socio indicado por parámetro y la segunda para ver si también existe un producto con el número de producto dado.

Si todo fue bien, llama al método alquila() del socio, enviándole el producto que desea alquilar.

Nota: El método alquila() del socio tiene cierta complejidad, pero ya la vimos cuando explicamos la clase socio. En este momento, por el principio de encapsulación de la POO, debemos abstraernos de su dificultad y no prestarle atención porque sabemos que funciona y no nos debe preocupar cómo lo hace.

Para probar la clase videoclub podríamos utilizar un código como este:

$vc = new videoclub("La Eliana Video"); 

//voy a incluir unos cuantos soportes de prueba 
$vc->incluir_juego("Final Fantasy", 2.5, "Playstation",1,1); 
$vc->incluir_juego("GP Motoracer", 3, "Playstation II",1,2); 
$vc->incluir_dvd("Los Otros", 4.5, "Inglés y español","16:9"); 
$vc->incluir_dvd("Ciudad de Diós", 3, "Portugués, inglés y español","16:9"); 
$vc->incluir_dvd("Los Picapiedra", 3, "Español","16:9"); 
$vc->incluir_cinta_video("Los Otros", 4.5, "115 minutos"); 
$vc->incluir_cinta_video("El nombre de la Rosa", 1.5, "140 minutos"); 

//listo los productos 
$vc->listar_productos(); 

//voy a crear algunos socios 
$vc->incluir_socio("José Fuentes"); 
$vc->incluir_socio("Pedro García",2); 

$vc->alquila_a_socio(1,2); 
$vc->alquila_a_socio(1,3); 
//alquilo otra vez el soporte 2 al socio 1. 
// no debe dejarme porque ya lo tiene alquilado 
$vc->alquila_a_socio(1,2); 
//alquilo el soporte 6 al socio 1. 
//no se puede porque el socio 1 tiene 2 alquileres como máximo 
$vc->alquila_a_socio(1,6); 

//listo los socios 
$vc->listar_socios();

Se hace una carga de datos y una llamada a todos los métodos que hemos visto para el videoclub. Este código dará como resultado una salida como la siguiente:

Incluido soporte 0
Incluido soporte 1
Incluido soporte 2
Incluido soporte 3
Incluido soporte 4
Incluido soporte 5
Incluido soporte 6

Listado de los 7 productos disponibles:

Juego para: Playstation
Final Fantasy
2.5 (IVA no incluido)
Para un jugador

Juego para: Playstation II
GP Motoracer
3 (IVA no incluido)
De 1 a 2 Jugadores.

Película en DVD:
Los Otros
4.5 (IVA no incluido)
Inglés y español

Película en DVD:
Ciudad de Diós
3 (IVA no incluido)
Portugués, inglés y español

Película en DVD:
Los Picapiedra
3 (IVA no incluido)
Español

Película en VHS:
Los Otros
4.5 (IVA no incluido)
Duración: 115 minutos

Película en VHS:
El nombre de la Rosa
1.5 (IVA no incluido)
Duración: 140 minutos

Incluido socio 0
Incluido socio 1

Alquilado soporte a: Pedro García
Película en DVD:
Los Otros
4.5 (IVA no incluido)
Inglés y español

Alquilado soporte a: Pedro García
Película en DVD:
Ciudad de Diós
3 (IVA no incluido)
Portugués, inglés y español

El cliente ya tiene alquilado el soporte Los Otros

Este cliente tiene 2 elementos alquilados. No puede alquilar más en este videoclub hasta que no devuelva algo

Listado de 2 socios del videoclub:

Cliente 0: José Fuentes
Alquileres actuales: 0

Cliente 1: Pedro García
Alquileres actuales: 2

Hasta aquí ha llegado por ahora el desarrollo de este videoclub, que no es muy funcional pero esperamos que haya servido para empezar a conocer las características de la programación orientada a objetos.

En adelante, seguiremos este manual comentando otras particularidades de la POO en PHP 5, que también hay que conocer.

Miguel Angel Alvarez

Miguel es fundador de DesarrolloWeb.com y la plataforma de formación online Escu...

Manual