Ver Mensaje Individual
  #6 (permalink)  
Antiguo 07/08/2013, 20:08
Avatar de Triby
Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: [POO] interfaces

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 original
  1. interface interfazControlador {
  2.       public function config($parametros);
  3.       public function getVar($name);
  4.       public function setVar($name, $value);
  5. }

En tus clases necesariamente debes implementar todos los métodos de la interface o se generará un error fatal.

Código PHP:
Ver original
  1. class productos implements interfazControlador {
  2.        private $_vars = array();
  3.        public function __construct() {
  4.             /* Aquí inicializas la clase /*
  5.        }
  6.        public function config($parametros) {
  7.             /* Estableces alguna configuración de la clase */
  8.             foreach($parametros as $name => $value) {
  9.                   $this->setVar($name, $value);
  10.             }
  11.        }
  12.        public function getVar($name) {
  13.             return (isset($this->_vars[$name])) ? $this->_vars[$name] : null;
  14.        }
  15.        public function setVar($name, $value) {
  16.             $this->_vars[$name] = $value;
  17.        }
  18. }

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 original
  1. abstract class abstractControlador {
  2.        private $_vars = array();
  3.        public function __construct();
  4.        public function config($parametros) {
  5.             /* Estableces alguna configuración de la clase */
  6.             foreach($parametros as $name => $value) {
  7.                   $this->setVar($name, $value);
  8.             }
  9.        }
  10.        public final function getVar($name) {
  11.             return (isset($this->_vars[$name])) ? $this->_vars[$name] : null;
  12.        }
  13.        public final function setVar($name, $value) {
  14.             $this->_vars[$name] = $value;
  15.        }
  16. }

Con eso, tu clase quedaría más o menos así:
Código PHP:
Ver original
  1. class productos extends abstractControlador {
  2.        public function __construct() {
  3.             /* Aquí inicializas la clase */
  4.        }
  5.        // getVar() y setVar() no puedes declararlos nuevamente
  6.        // porque son finales en la clase abstracta
  7.        // Pero, a pesar de que config() ya tiene código
  8.        // al no ser final sí puedes "sobreescribirla"
  9.        public function config($parametros) {
  10.              /** Aquí el código necesario */
  11.        }
  12. }

De hecho, puedes combinar interfaces y clases abstractas sin problema.
__________________
- León, Guanajuato
- GV-Foto