Como aprendiz de POO, "endiendo" que el uso de interfaces o de clases abstractas facilita la creación de clases/objetos con una estructura similar, por ejemplo:
Vas a crear módulos de productos, categorías, clientes, etc. y deseas que todos tengan determinadas propiedades y/o métodos:
Código PHP:
Ver originalinterface interfazControlador {
public function config($parametros);
public function getVar($name);
public function setVar($name, $value);
}
En tus clases necesariamente debes implementar todos los métodos de la interface o se generará un error fatal.
Código PHP:
Ver originalclass productos implements interfazControlador {
private $_vars = array(); public function __construct() {
/* Aquí inicializas la clase /*
}
public function config($parametros) {
/* Estableces alguna configuración de la clase */
foreach($parametros as $name => $value) {
$this->setVar($name, $value);
}
}
public function getVar($name) {
return (isset($this->_vars
[$name])) ?
$this->_vars
[$name] : null; }
public function setVar($name, $value) {
$this->_vars[$name] = $value;
}
}
La diferencia entre una interfaz y una clase abstracta es que en esta última puedes declarar métodos que contengan lógica, ejemplo:
Código PHP:
Ver originalabstract class abstractControlador {
private $_vars = array(); public function __construct();
public function config($parametros) {
/* Estableces alguna configuración de la clase */
foreach($parametros as $name => $value) {
$this->setVar($name, $value);
}
}
public final function getVar($name) {
return (isset($this->_vars
[$name])) ?
$this->_vars
[$name] : null; }
public final function setVar($name, $value) {
$this->_vars[$name] = $value;
}
}
Con eso, tu clase quedaría más o menos así:
Código PHP:
Ver originalclass productos extends abstractControlador {
public function __construct() {
/* Aquí inicializas la clase */
}
// getVar() y setVar() no puedes declararlos nuevamente
// porque son finales en la clase abstracta
// Pero, a pesar de que config() ya tiene código
// al no ser final sí puedes "sobreescribirla"
public function config($parametros) {
/** Aquí el código necesario */
}
}
De hecho, puedes combinar interfaces y clases abstractas sin problema.