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
?>