Inicio > PHP > Curso PHP. Capítulo 8: Programación orientada a objetos. (II/II)

Curso PHP. Capítulo 8: Programación orientada a objetos. (II/II)

Una vez visto gran parte de los conceptos orientados a objetos en PHP vamos a mostrar un ejemplo que maneja objetos para gestionar un videoclub. Antes de nada, hay que decir que este ejemplo no está completo, ni siquiera es la forma ideal de realizar una aplicación de gestión, pero nos sirve como ejemplo para aprender a manejar objetos.

Vamos a realizar en primer lugar un diagrama de clases en UML para representar gráficamente las clases que vamos a utilizar para gestionar los diferentes objetos. Para no alargar mucho el ejemplo, vamos a contar con una serie de clases muy limitadas:

-La clase Videoclub: es la clase principal de nuestra aplicación. Representa a un videoclub en el dominio del problema y cuenta con una colección de clientes y productos registrados. Así como métodos para alquilar un producto a un cliente, y registrar nuevos productos y clientes en el videoclub.

-La clase Cliente: representa a un cliente. Cuenta con una variable que representa la colección de productos alquilados.

-La clase Producto: clase abstracta que representa un producto del videoclub. No podemos instanciar objetos Producto. Cuenta con una serie de atributos que heredarán las subclases, nombre y precio.

-Las clases Pelicula, Cd, Juego: clases derivadas de la clase padre Producto. Representan los diferentes productos del que dispone el videoclub. Cada producto tiene asignado un precio diferente de alquiler. Para mostrar un ejemplo de clases abstractas, herencias y reemplazo de métodos, he diseñado la clase Producto con un método abstracto getPrecio() que deberán implementar las clases derivadas. Así cada tipo de Producto contará con un método getPrecio() que devolverá el precio en función del tipo de producto que sea. Las peliculas devolverán 2 euros, los cds de música devolverán 1 euro y los juegos 3 euros.

Tras esta breve descripción de las clases del dominio de nuestra aplicación, vamos a crear el código PHP que utilizaremos para instanciar objetos:

Clase Cliente

<?php

/* Clase que representa a un cliente en el dominio del problema */
class Cliente
{
	private $nombre;
	private $productosAlquilados;

	public function __construct($nombre)
	{
		$this->nombre=$nombre;
		$this->productosAlquilados=array();
	}

	public function getNombre()
	{
		return $this->nombre;
	}

	public function getProductosAlquilados()
	{
		return $this->productosAlquilados;
	}

	public function alquilarProducto($producto)
	{
		$this->productosAlquilados[]=$producto;
		return true;
	}
}
?>

Clase Producto

<?php
abstract class Producto
{
    protected $nombre;
    protected $precio;

    public function getNombre()
    {
       return $this->nombre;
    }

    abstract public function getPrecio();
}
?>

Clase Pelicula

<?php
class Pelicula extends Producto
{

	private $idioma;
	private $duracion;
	private $genero;

	public function __construct($nombre,$idioma,$duracion,$genero)
	{
		$this->nombre = $nombre;
		$this->precio = 2;
		$this->idioma = $idioma;
		$this->duracion = $duracion;
		$this->genero=$genero;
	}

    public function getPrecio()
	{
	   return $this->precio;
	}

	public function getIdioma()
	{
	   return $this->precio;
	}

	public function getDuracion()
	{
	   return $this->precio;
	}
}
?>

Clase Cd

<?php
class Cd extends Producto
{

	private $duracion;
	private $genero;

	public function __construct($nombre,$duracion,$genero)
	{
		$this->nombre = $nombre;
		$this->precio = 1;
		$this->genero = $genero;
		$this->duracion = $duracion;
	}

    public function getPrecio()
	{
	   return $this->precio;
	}

	public function getDuracion()
	{
	   return $this->duracion;
	}

	public function getGenero()
	{
	   return $this->Genero;
	}
}
?>

Clase Juego

<?php
class Juego extends Producto
{

	private $plataforma;
	private $genero;

	public function __construct($nombre,$plataforma,$genero)
	{
		$this->nombre = $nombre;
		$this->precio = 3;
		$this->idioma = $idioma;
		$this->duracion = $duracion;
	}

    public function getPrecio()
	{
	   return $this->precio;
	}

	public function getPlataforma()
	{
	   return $this->plataforma;
	}

	public function getGenero()
	{
	   return $this->Genero;
	}
}
?>

Clase Videoclub

<?php

include_once('class.cliente.php');
include_once('class.producto.php');
include_once('class.pelicula.php');
include_once('class.cd.php');
include_once('class.juego.php');

class Videoclub
{

	private $nombre;
	private $productos;
	private $clientes;

	public function __construct($nombre)
	{
		$this->nombre=$nombre;
		$this->productos=array();
		$this->clientes=array();
	}

	public function addProducto($producto)
	{
		$this->productos[]=$producto;
	}

	public function getProductos()
	{
		return $this->productos;
	}

	public function addCliente($cliente)
	{
		$this->clientes[]=$cliente;
	}

	public function getClientes()
	{
		return $this->clientes;
	}

	public function alquilar($cliente,$producto)
	{
		$cliente->alquilarProducto($producto);
	}

}
?>

Ya tenemos creadas las clases que vamos a utilizar para instanciar objetos y gestionar nuestro videoclub. Ahora realizamos un pequeño script de ejemplo que muestr el manejo de estos objetos.

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Prueba</title>
</head>
<body>

<?php

include_once('class.videoclub.php');

//Creamos un videoclub
$videoclub= new Videoclub('VideoMax');

//Creamos un nuevo cliente de nombre Francisco
$cliente=new Cliente('Francisco');

//Creamos una nueva pelicula
$pelicula=new Pelicula('El señor de los Anillos','Castellano','3 horas','Fantasía');

//Registramos el cliente y el producto en el videoclub
$videoclub->addCliente($cliente);
$videoclub->addProducto($pelicula);

//El cliente alquila la pelicula
$videoclub->alquilar($cliente, $pelicula);

//Obtenemos la lista de clientes registrados
$clientes = $videoclub->getClientes();

//Imprimimos la lista de clientes registrados
echo '<p>Lista de Clientes:</p>';
foreach($clientes as $cliente)
{
	echo $cliente->getNombre().'<br />';
}

//Obtenemos la lista de productos registrados
$productos = $videoclub->getProductos();
echo '<p>Lista de Productos:</p>';
foreach($productos as $producto)
{
	echo $producto->getNombre().'<br />';
}

?>

</body>
</html>

No hay mucho más que decir de este script de ejemplo ya que el código viene muy detallado. Creamos una instancia del videoclub, un nuevo cliente y un nuevo producto, los registramos dentro del videoclub, y alquilamos la pelicula al cliente. Despúes obtenemos los clientes y productos registrados y los mostramos por pantalla. Y hasta aquí nuestra pequeña aplicación de prueba.

Vuelvo a repetir, que no es una buena forma de implementar una aplicación de gestión, ya que no persisten los datos. Con cada nueva petición, se creará un nuevo videoclub vacio. Y se volverán a añadir el cliente y la película. Además las clases están incompletas, faltan métodos, como el de devolver el producto, eliminar un cliente, eliminar un producto, comprobar si el producto está disponible y no está alquilado, y ni siquiera interactúa con el usuario, simplemente sigue las mismas instrucciones con cada petición. En definitiva, que es una chapuza de aplicación lo que hemos creado, pero sirve bastante bien para ver como podemos manejar objetos a partir de clases creadas por nosotros mismos.

Cuando vayamos avanzando en el curso de PHP seremos capazes de crear aplicaciones profesionales, utilizando patrones de diseño,  frameworks orientados a objetos como symfony para estructurar bien el código siguiendo una arquitectura MVC (modelo-vista-controlador). Aprenderemos a persistir datos mediante ficheros y bases de datos. A persistir estados entre distintas peticiones del mismo usuario mediante las sesiones y mucho más. Paso a paso, nutriendonos  de conocimiento.

El próximo capítulo supongo que lo dedicaré al manejo de ficheros.

Hasta la próxima.

About these ads
  1. Leonardo Ormazabal
    13 octubre, 2010 en 18:27 | #1

    Muy buen material, la verdad es que muy didáctico y claro. Espero ver pronto el nuevo material.

    Gracias,

    • Juan
      22 agosto, 2011 en 7:00 | #2

      Excelente la forma en que lo expones Francisco, más claro no se puede pedir, estaremos pendientes de las nuevas publicaciones en especial esta de PHP orientada a objetos.

      Gracias

  2. 13 febrero, 2013 en 6:09 | #3

    Hola, está muy bueno este artículo, me viene muy bien. una pregunta ¿Para conectarlo con una base de datos mysql cómo debería ser?
    Saludos y gracias.

  3. Danny Daniel Huamani Cuba
    28 abril, 2013 en 20:31 | #4

    muy buen ejemplo, muchas gracias amigos del rincón de un parasito virtual

  4. Gladys
    31 julio, 2013 en 13:57 | #5

    como deberia funcionar?

  1. No trackbacks yet.

Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.

Únete a otros 124 seguidores

%d personas les gusta esto: