<?php

// *********************************************************************
// 
//  taller1.php5
//
//  Taller de Programación Orientada a Objetos
//  para programadores de PHP
//
//  http://www.linuxcabal.org
//
//  Autor: Jerónimo Sánchez <jsanchez@consecutio.com>
// 

// gracias a la función especial __autoload() no necesitamos
// incluir manualmente cada archivo fuente. para que funcione es
// importante que el archivo fuente se llame igual que la clase
// que contiene, seguido de ".class.php5".

function __autoload ($clase) {
    include_once $clase.'.class.php5';
}

// creamos un cliente llamado Luis:

$cliente1 = new Cliente();
$cliente1->ponerNombre('Luis');

// creamos el producto1, con código '1' y
// precio $100:

$producto1 = new Producto();
$producto1->ponerDescripcion('producto1');
$producto1->ponerCodigo('1');   // utilizamos el "setter" para código
//$producto->ponerCodigo(-1);   // esta llamada fallaría porque ponerCodigo()
                                // valida antes de tomar el valor
$producto1->ponerPrecio(100);   // utilizamos el "setter" para precio

// creamos el producto2, con código '5' y
// precio $50.00:

$producto2 = new Producto();
$producto2->ponerDescripcion('producto2');
$producto2->ponerCodigo('5');
$producto2->ponerPrecio(50);

// creamos el producto3, con código '6' y
// precio $10.00:

$producto3 = new Producto();
$producto3->ponerDescripcion('producto3');
$producto3->ponerCodigo('6');
$producto3->ponerPrecio(10);

// creamos el pedido1 (normal) para el cliente1
// con los productos que acabamos de crear:

$pedido1 = new Pedido($cliente1);

$pedido1->anyadirProducto($producto1);
$pedido1->anyadirProducto($producto2);
$pedido1->anyadirProducto($producto3);

// imprimimos el pedido1:

$pedido1->imprimir();


echo 'AHORA CON DESCUENTO: <br /><br />';

// creamos el pedido2 (sin descuento) para el mismo
// cliente y con los mismos productos:

$pedido2 = new PedidoConDescuento($cliente1);

$pedido2->anyadirProducto($producto1);
$pedido2->anyadirProducto($producto2);
$pedido2->anyadirProducto($producto3);

// aplicamos un descuento del 50% al pedido2

// esto sólo es posible porque la clase PedidoSinDescuento
// soporta descuentos, es decir, implementa el nuevo método
// ponerDescuento() y redefine el método calcularTotal()
// de la clase Pedido que extiende.

$pedido2->ponerDescuento(0.5);

// imprimimos el pedido2:

// aunque el método imprimir() está definido en Pedido, la 
// versión de calcularTotal() que se llamará será esta vez la
// de PedidoConDescuento y no la de Pedido. 
// esto es así porque pedido2 es de la clase PedidoConDescuento, 
// donde se creó una nueva versión de calcularTotal().

$pedido2->imprimir();

?>
