Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

Herencia de Clase Abstracta, duda

Estas en el tema de Herencia de Clase Abstracta, duda en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Buenas tardes, Originalmente, diseñe esta clase para realizar consultas con MYSQL: MySQL.php @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código PHP: Ver original class MySQL {     private $_config ...
  #1 (permalink)  
Antiguo 07/05/2012, 12:12
Avatar de McBlink  
Fecha de Ingreso: noviembre-2006
Ubicación: $ARG->LaPampa()
Mensajes: 1.694
Antigüedad: 17 años, 5 meses
Puntos: 23
Herencia de Clase Abstracta, duda

Buenas tardes,
Originalmente, diseñe esta clase para realizar consultas con MYSQL:
MySQL.php
Código PHP:
Ver original
  1. class MySQL
  2. {
  3.     private $_config = array();
  4.     private static $_instance = NULL;
  5.     private static $_connected = FALSE;
  6.     private $_link = NULL;
  7.     private $_result = NULL;
  8.    
  9.     // INSTANCIA SINGLETON DE LA CLASE
  10.     public static function getInstance($config = array())
  11.     {
  12.         if (self::$_instance === NULL)
  13.         {
  14.             self::$_instance = new self($config);
  15.         }
  16.         return self::$_instance;
  17.     }
  18.    
  19.     // Constructor privado
  20.     private function __construct(array $config)
  21.     {
  22.         if (count($config) < 4)
  23.         {
  24.             throw new MySQLAdapterException();  
  25.         }
  26.         $this->_config = $config;
  27.     }
  28.    
  29.     private function __clone(){}
  30.    
  31.     private function connect()
  32.     {
  33.         // conecto solo una vez
  34.         if (self::$_connected === FALSE)
  35.         {
  36.             list($host, $user, $password, $database) = $this->_config;
  37.             $this->_link = mysqli_connect($host, $user, $password, $database);
  38.             self::$_connected = TRUE;
  39.             unset($host, $user, $password, $database);      
  40.         }
  41.     }  
  42.    
  43.     public function query($query)
  44.     {
  45.         //realizo una consulta, la guardo en $_result
  46.     }
  47. }

En fin, creo una instancia singleton de la clase, pasando como parámetros los datos de conexión. Elimine metodos para hacer mas legible la clase.

Lo que estoy intando realizar ahora, es hacer una abstracción de la clase y setear los métodos abstractos que deberían implementar las clases que lo heredan.

DB_Adapter.php
Código PHP:
Ver original
  1. abstract class DB_Adapter
  2. {
  3. abstract function query(){}
  4. abstract function fetch(){}
  5. abstract function fetchAll(){}
  6. }

MySQL.php
Código PHP:
Ver original
  1. class MySQL extends DB_Adapter
  2. {
  3. //y acá???? :)
  4. }
Ahora bien, tengo dudas sobre como o donde poner los constructores singleton, y los métodos de conexión a la base de datos.

A la hora de instanciar una clase, por ejemplo el adaptar para MySQL o uno para PDO, como debería hacerlo?


Gracias!!
  #2 (permalink)  
Antiguo 07/05/2012, 13:48
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Herencia de Clase Abstracta, duda

Sí los métodos son abstractos, no les debes de dar nada de contenido, solamente la declaración ej:
Código PHP:
Ver original
  1. abstract class Foo {
  2.        abstract public function getBar();
  3. }
  4.  
  5. class Bar extends Foo
  6. {
  7.       public function getBar()
  8.       {
  9.                return $something;
  10.       }
  11. }

Ahora, no existe lo que dices "constructores singleton" es un horror (sí con h) pensar en ese concepto.

Si buscas en el foro verás porque no se debe de usar Singleton para las bases de datos, pero sí lo deseas hacer, este no se puede heredar a menos que uses LSB (Late Static Binding (y PHP 5.3+)) para poder hacer la "herencia" del método estático singleton.

Lo mejor para guardar la instancia de la base de datos es usar un registro, o aún mejor, usar DI para inyectar el recurso en tus DAOs.

Saludos.
  #3 (permalink)  
Antiguo 07/05/2012, 13:49
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Herencia de Clase Abstracta, duda

Que tal McBlink,

Te sugiero que busques en el foro o googles un poco sobre porque NO debes utilizar Singleton y menos para la conexión a la bbdd, tambien puedes mirar como implementan la capa de drivers los diferentes fw's para darte una idea, Zend 2, Doctrine 2, y en tu lugar simplemente utilizaria el DBAL de D2(si la versión de PHP te lo permite).

Edit: @GatorV no empieces

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)

Última edición por masterpuppet; 07/05/2012 a las 13:55
  #4 (permalink)  
Antiguo 07/05/2012, 14:18
Avatar de McBlink  
Fecha de Ingreso: noviembre-2006
Ubicación: $ARG->LaPampa()
Mensajes: 1.694
Antigüedad: 17 años, 5 meses
Puntos: 23
Respuesta: Herencia de Clase Abstracta, duda

Gracias a ambos como siempre!
después del reto que me dieron, me puse a investigar sobre el patrón Registro (que no conocía)

Ahora bien, sacando de lado el Singleton, con respecto a la herencia de la clase abstracta, que era lo que mas me confundía.

Si yo tengo lo siguiente:

Adapter.php
- MysqlDriver.php
- PDODriver.php
- OtroDriver.php

Ambos que heredan e implementan los métodos abstractos del adaptador. Yo, debería crear una instancia de driver que deseo usar junto con su configuración? es así esto?


Cita:
ambien puedes mirar como implementan la capa de drivers los diferentes fw's para darte una idea, Zend 2, Doctrine 2
Estoy mirando como funciona el adaptador de CodeIgniter y Zend, pero la verdad que con tantas clases que tienen no logro ver con claridad las cosas!


Gracias

AGREGO: Si esto es asi como lo exprese en la lineas aqui arriba, la única función que cumpliría el Adaptador es de marcar los métodos y obligar a implementarlos a los drivers. Eso es correcto?
  #5 (permalink)  
Antiguo 07/05/2012, 14:42
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Herencia de Clase Abstracta, duda

La idea de una clase abstracta es como una "interfaz mejorada" es decir, una interfaz, obliga a las clases que la implementen a difinir ciertos métodos que tiene la interfaz para que cumpla con el contrato de uso.

Una clase abstracta va más allá de ello, ya que aparte te permite definir métodos comunes que pueden usar las clases más especializadas, y así ahorrar código.

Un ejemplo muy rápido que se me viene a la mente, es un generador de códigos de referencias bancarias.

Supongamos que tienes 10 bancos, y cada banco tiene un algoritmo propio para crear una referencia, pero en tu sistema tienes por ejemplo los datos base para el pago (el usuario, el monto, la fecha límite, y el concepto).

Puedes hacer una clase abstracta, base que tenga los métodos comunes (getUsuario(), getFechaLimite(), getConcepto()) y un método abstracto (getReferencia()) en cada clase que la extienda por cada banco, haces la implementación correcta de getReferencia() y así solamente debes de cambiar la clase que usa el banco para obtener los datos correctos.

Inclusive puedes usar un Factory para obtener la clase armada, dependiendo del adapter y así consumir sus métodos (que son los mismos ya que están "obligados" por la interfaz) y así consumir tu clase sin problemas.
  #6 (permalink)  
Antiguo 08/05/2012, 10:20
Avatar de McBlink  
Fecha de Ingreso: noviembre-2006
Ubicación: $ARG->LaPampa()
Mensajes: 1.694
Antigüedad: 17 años, 5 meses
Puntos: 23
Respuesta: Herencia de Clase Abstracta, duda

Gracias a ambos por las respuestas!
aprovecho el post para hacer una pregunta mas, estuve leyendo por ahi acerca de un patrón Facade si no mal entendí y no se me mezclaron las cosas.

Es posible, por ejemplo, dentro de ese objeto asociar mediante atributos estaticos a demás clases que proveen funcionalidades distintas, de manera de llamar estaticamente a esas clases?

Por ejemplo,

Código PHP:
Ver original
  1. Class Facade {
  2.  
  3. public static $db;
  4. public static $helper;
  5.  
  6. }

No es posible almacenar una instancia de esas clases dentro del facade todo estaticamente, no?

Gracias!
  #7 (permalink)  
Antiguo 08/05/2012, 10:27
Avatar de McBlink  
Fecha de Ingreso: noviembre-2006
Ubicación: $ARG->LaPampa()
Mensajes: 1.694
Antigüedad: 17 años, 5 meses
Puntos: 23
Respuesta: Herencia de Clase Abstracta, duda

Leyendo un poco más, encontre este articulo que CREO responde mi ultima pregunta.

http://whiteboxcomputing.com/php/static_wrapper/

Esto es correcto? digo, en el constructor de la clase crear los demas objectos y luego llamarlos estaticamente, sea por esa función global o por funciones intermedias que tenga el Facade..

Gracias!
  #8 (permalink)  
Antiguo 08/05/2012, 14:13
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Herencia de Clase Abstracta, duda

No me gusta ese patrón para nada, creo que rompe con todo lo que te brinda POO, mejor ve Dependency Injection, es mucho mejor y más limpio.

Saludos.

Etiquetas: clase, class, herencia, php
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 04:13.