Daniel Segovia

Blog personal

Archive for the ‘4.12 Interfaces’ Category

Extender interfaces

Hacer un comentario

Siguiendo con interfaces veamos con se extienden.
Al igual que las clases lo hacen con la palabra reservada extends

Usaremos parte del ejemplo anterior con la interfaz extendible, ahora trabajaremos con la luz, para encenderla o apagarla debemos tener una llave de luz.

<?php
 
interface llave{
    public function interruptor();
}
 
interface encendible extends llave{
    public function encender();
    public function apagar(); 
}
 
class luz implements encendible{
 
    protected $estado;
 
    function __construct(){
        $this->setEstado(false);
    }
 
    public function getEstado(){
        return $this->estado;
    }
 
    public function setEstado($nuevoEstado){
        $this->estado = $nuevoEstado;
    }
 
    public function encender(){
        $this->setEstado(true);
        echo "La luz ha sido se encendida<br />";
    }
 
    public function apagar(){
        $this->setEstado(false);
        echo "La luz ha sido se apagada<br />";
    }
 
    public function interruptor(){
        if($this->getEstado()){
            $this->apagar();
        }else{
            $this->encender();
        }
    }
 
}
 
$luz = new luz;
$luz->interruptor(); //La luz ha sido se encendida
$luz->interruptor(); //La luz ha sido se apagada
$luz->interruptor(); //La luz ha sido se encendida
$luz->interruptor(); //La luz ha sido se apagada
?>

Written by Daniel Segovia

abril 20th, 2011 at 6:16 pm

Posted in 4.12 Interfaces

Interfaces

Hacer un comentario

Las interfaces de objetos en PHP nos permiten especificar los métodos que deberán ser implementados por una clase sin tener que definir que acciones realizarán.
La palabra reservada para definir interfaces en PHP5 es interface
Todos los métodos declarados en la interfaz deben ser public
Para trabajar con una interfaz se usa la palabra reservada implements. Todos los métodos que están definidos en la interfaz deberán estar en la clase sino esto producirá un fatal error. Cada clase puede implementar más de una interfaz y esto se realiza llamando a cada interfaz separadas por coma.
Una clase no puede implementar interfaces que posean nombres de funciones con el mismo nombre, sino esto produciría una colisión.
Al escribir una interfaz esta puede extender de otra, al igual que las clases, utilizando extends.

Veamos las interfaces con un ejemplo practico.
Pensemos en una moto y en un cartel de publicidad, a la vista no tienen nada en común, pero puede que sí lo tengan.
Pero tienen cosas en común, ambos necesitan en algún momento ser encendidos, la moto para que funcione y el cartel necesita encender las luces cuando es de noche. Lo mismo a la inversa ambos “objetos” en algún momento necesitan ser apagados.
Entonces tenemos que la moto y el cartel necesitan ser encendidos y apagados en algún momento, con este ejemplo concreto podremos definir una interfaz que obligue a las clases tener el método encender y apagar.

<?php
interface encendible{
    public function encender();
    public function apagar(); 
}
 
class moto implements encendible{
 
    protected $nafta;
    protected $estado;
 
    function __construct(){
        $this->setNafta(2);
        $this->setEstado(false);
    }
 
    public function getNafta(){
        return $this->nafta;
    }
 
    public function setNafta($litros){
        $this->nafta = $litros;
    }
 
    public function getEstado(){
        return $this->estado;
    }
 
    public function setEstado($nuevoEstado){
        $this->estado = $nuevoEstado;
    }
 
    public function descontarNafta($litros){
        $this->setNafta($this->getNafta() - $litros);
    }
 
    public function encender(){
        if($this->getNafta() > 0){
            if(!$this->getEstado()){
                $this->setEstado(true);
                $this->descontarNafta(1);
                echo "La moto ha sido se encendida<br />";
            }else{
                echo "La moto se encuentra encendida<br />";
            }
        }else{
            echo "La moto no tiene nafta<br />";
        }
    }
 
    public function apagar(){
        if($this->getEstado()){
            $this->setEstado(false);
            echo "La moto ha sido se apagada<br />";
        }else{
            echo "La moto se encuentra apagada<br />";
        }
    } 
}
 
class cartel implements encendible{
 
    protected $estado;
 
    function __construct(){
        $this->setEstado(false);
    }
 
    public function getEstado(){
        return $this->estado;
    }
 
    public function setEstado($nuevoEstado){
        $this->estado = $nuevoEstado;
    }
 
    public function encender(){
        if(!$this->getEstado()){
            $this->setEstado(true);
            echo "El cartel publicitario ha sido se encendido<br />";
        }else{
            echo "El cartel publicitario se encuentra encendido<br />";
        }
    }
 
    public function apagar(){
        if($this->getEstado()){
            $this->setEstado(false);
            echo "El cartel publicitario ha sido se apagado<br />";
        }else{
            echo "El cartel publicitario se encuentra apagado<br />";
        }
    }
}
 
$moto = new moto;
$moto->encender(); //La moto ha sido se encendida
$moto->encender(); //La moto se encuentra encendida
$moto->apagar(); //La moto ha sido apagada
$moto->apagar(); //La moto se encuentra apagada
$moto->encender(); //La moto ha sido se encendida
$moto->apagar(); //La moto ha sido apagada
$moto->encender(); //La moto no tiene nafta
//Si seguimos jugando la moto se va a romper
 
echo "<hr />";
 
$cartel = new cartel;
$cartel->encender(); //El cartel publicitario ha sido se encendido
$cartel->encender(); //El cartel publicitario se encuentra encendido
$cartel->apagar(); //El cartel publicitario ha sido se apagado
$cartel->apagar(); //El cartel publicitario se encuentra apagado
 
?>

Written by Daniel Segovia

abril 19th, 2011 at 1:24 pm

Posted in 4.12 Interfaces