Ver Mensaje Individual
  #5 (permalink)  
Antiguo 13/02/2014, 16:32
lolainas
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: problema clase abstract PDO no conecta

La dependencia en los buenos diseños se da en niveles más altos de abstracción, no en una clase que trabaja a bajo nivel como una conexión a la base de datos, estarías reescribiendo PDO intentando algo así, osea, reinventando la rueda.
Lo que deben hacer tus objetos es depender de la base de datos y para eso debes inyectar esa dependencia en el constructor de esos objetos dependientes.

te pongo un ejemplo rápido:
Código PHP:
Ver original
  1. <?php
  2.  
  3. abstract class BaseDeDatos {
  4.  
  5.     private $db;
  6.  
  7.     function __construct(PDO $db) {
  8.         $this->db = $db;
  9.     }
  10.  
  11.     protected function execute($statement, array $args = []) {
  12.         $stmt = $this->db->prepare($statement);
  13.         $stmt->execute($args);
  14.         return $stmt->fetchAll(PDO::FETCH_ASSOC);
  15.     }
  16.  
  17. }
  18.  
  19. interface Persona {
  20.  
  21.     function getNombre();
  22.  
  23.     function getApellido();
  24.  
  25. }
  26.  
  27. class Usuario extends BaseDeDatos implements Persona {
  28.  
  29.     function getNombre() {
  30.         return $this->execute('SELECT nombre FROM tabla_usuarios WHERE id = 1;')[0]['nombre'];
  31.     }
  32.  
  33.     function getApellido() {
  34.         return $this->execute('SELECT apellido FROM tabla_usuarios WHERE id = 1;')[0]['apellido'];
  35.     }
  36.  
  37. }
  38.  
  39. interface PlantillaPersona {
  40.  
  41.     function dibujar(Persona $persona);
  42.  
  43. }
  44.  
  45. class PersonaEnTabla implements PlantillaPersona {
  46.  
  47.     function dibujar(Persona $persona) {
  48.         return
  49.             "<table><tr><th>Nombre</th><th>Apellido</th></tr>" .
  50.             "<tr><td>{$persona->getNombre()}</td><td>{$persona->getApellido()}</td></tr></table>";
  51.     }
  52.  
  53. }
  54.  
  55. class PersonaEnDiv implements PlantillaPersona {
  56.  
  57.     function dibujar(Persona $persona) {
  58.         return
  59.             "<div><label>Nombre</label><span>{$persona->getNombre()}</span>" .
  60.             "<label>Apellido</label><span>{$persona->getApellido()}</span></div>";
  61.     }
  62.  
  63. }
  64.  
  65.  
  66. // para acabar haciendo algo así (todo lo que no deberías hacer dentro de las clases):
  67. $db = new PDO('dsn', 'user', 'pass');
  68.  
  69. $usuario = new Usuario($db);
  70.  
  71. echo "Persona dibujada en una tabla:";
  72. echo (new PersonaEnTabla)->dibujar($usuario);
  73.  
  74. echo "Persona dibujada en una capa div:";
  75. echo (new PersonaEnDiv)->dibujar($usuario);

Como ves la inyección de dependencia se da en la lógica de negocio (no en la conexión a la base de datos, que para eso ya esta PDO), en el nivel más alto de abstracción de tu aplicación.

Última edición por lolainas; 13/02/2014 a las 16:37