Hola principianteZF :) a lo que me refiero yo con respecto a las interfaces es que mas que un orden en tu código te ayudan a establecer un contrato de implementación, para que puedas olvidar en tus clases con que tipo de objetos estas tratando y llamarlos a través de su interface asegurando que que tendrás polimorfismo por parte del lenguaje llamando al método correcto de cada objeto que use la interface.
En el código presentado la interfaz no se esta explotando ya que si quieres usar los beneficios de la interfaz necesitas tratar directamente con ella y no con los objetos que la implementan.
Interface Articulo
Código PHP:
interface Articulo {
public function setIdArticulo();
public function setPrecioArticulo();
public function getIdArticulo();
public function getPrecioArticulo();
}
El objetivo es crear un Objeto que implementa la interfaz Articulo por que se puede tratar como un articulo, pero que no es lo mismo vender electrodomesticos que vender mmm por ejemplo Carne.. ya que tienen metodos distinto de cobrarse pero siguen siendo articulos.
En este ejemplo suponemos que en los electrodomesticos el costo se debe multiplicar por 1.15 por que es el precio mas los impuestos y que en las cosas como carne esto no sucede.. es ahi donde las interfaces son un gran invento.
Objeto Electrodomestico
Código PHP:
class Electrodomestico implements Articulo
{
private $id_articulo;
private $precio_articulo;
public function __construct()
{
}
public function setIdArticulo($id_articulo)
{
$this->id_articulo = $id_articulo;
}
public function getIdArticulo()
{
return $this->id_articulo;
}
public function setPrecioArticulo($precio_articulo)
{
$this->precio_articulo = $precio_articulo;
}
public function getPrecioArticulo()
{
return $this->precio_articulo * 1.15;
}
}
En el caso de un objeto de tipo Carne, su metodo getPrecioArticulo no multiplica el precio y se mantiene igual.. ahora sigue la magia en la clase del carro de compras, tratar a todos los tipos de objeto como un Articulo y no como un Objeto Electrodomestico o Carne.. o cualquiera, pero teniendo la certeza de que cada objeto Articulo sabra como calcularse segun su tipo de objeto.
Objeto Carne
Código PHP:
class Carne implements Articulo
{
private $id_articulo;
private $precio_articulo;
public function __construct()
{
}
public function setIdArticulo($id_articulo)
{
$this->id_articulo = $id_articulo;
}
public function getIdArticulo()
{
return $this->id_articulo;
}
public function setPrecioArticulo($precio_articulo)
{
$this->precio_articulo = $precio_articulo;
}
public function getPrecioArticulo()
{
return $this->precio_articulo;
}
}
En realidad lo unico que cambia es el metodo.. addArticulo.
Código PHP:
// Ahora el parametro es un Articulo, y como un electrodomestico es un Articulo y un Objeto Carne tambien se comporta como tal por que implementan la interface articulo.
public function addArticulo(Articulo $articulo)
{
$id_articulo = $articulo->getIdArticulo();
if($id_articulo)
$this->coleccion_articulos[$id_articulo] = $articulo;
}
Ahora el ejemplo quedaria asi.
Código PHP:
// Creamos el carrito
$carrito = ColeccionArticulos::getCarrito();
// Creamos el 'Articulo 1'
$art1 = new Electrodomestico();
$art1->setIdArticulo("001");
$art1->setPrecioArticulo(45.60);
// Agregamos el 'Articulo 1' al carrito
$carrito->addArticulo($art1);
// Creamos el 'Articulo 2'
$art2 = new Carne();
$art2->setIdArticulo("005");
$art2->setPrecioArticulo(5.40);
// Agregamos el 'Articulo 2' al carrito
$carrito->addArticulo($art2);
Con esto aseguras que puedes tener reglas muy especiales para cada tipo de articulo y sin comprometer la funcionalidad de tu Carro de compras, por que el solo hablaria con articulos y no con implementaciones concretas.