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

Duda con clase para la DB(singleton).

Estas en el tema de Duda con clase para la DB(singleton). en el foro de Frameworks y PHP orientado a objetos en Foros del Web. buenas, tengo una clase que gestiona la base de datos(singleton) , Mi duda es la siguiente. tengo algo como esto. Código PHP: <?php class  clase ...
  #1 (permalink)  
Antiguo 05/08/2011, 08:28
Avatar de RIVERMILLOS  
Fecha de Ingreso: marzo-2010
Mensajes: 1.336
Antigüedad: 14 años, 2 meses
Puntos: 15
Duda con clase para la DB(singleton).

buenas, tengo una clase que gestiona la base de datos(singleton) , Mi duda es la siguiente. tengo algo como esto.

Código PHP:

<?php

class clase{

function 
__construct(){

$DB=$this->db::getInstance();

}

public function 
llamar(){

$claseX = new ClaseX();

}

}


?>

Mi duda es la siguenta , como hago para que en la ClaseX pueda utilizar la instancia de la base de datos sin tener que crearla dentro de esta misma.


saludos
  #2 (permalink)  
Antiguo 05/08/2011, 08:33
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: Duda con clase para la DB(singleton).

Guardalo en una propiedad de tu clase y se la pasas:
Código PHP:
Ver original
  1. class Foo
  2. {
  3.         private $_bar;
  4.  
  5.         public function __construct()
  6.         {
  7.                  $this->_bar = Something::getInstance();
  8.         }
  9.  
  10.         public function other()
  11.         {
  12.                 $obj = new Baz($this->_bar);
  13.         }
  14. }

Saludos.
  #3 (permalink)  
Antiguo 05/08/2011, 08:47
Avatar de RIVERMILLOS  
Fecha de Ingreso: marzo-2010
Mensajes: 1.336
Antigüedad: 14 años, 2 meses
Puntos: 15
Respuesta: Duda con clase para la DB(singleton).

Si había pensado algo así , pero pensé que no era buena idea.

saludos
  #4 (permalink)  
Antiguo 05/08/2011, 08:54
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: Duda con clase para la DB(singleton).

Lo que no es una buena idea es un Singleton para la bbdd, si googleas vas a encontrar mucha info al respecto.

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #5 (permalink)  
Antiguo 05/08/2011, 09:30
Avatar de RIVERMILLOS  
Fecha de Ingreso: marzo-2010
Mensajes: 1.336
Antigüedad: 14 años, 2 meses
Puntos: 15
Respuesta: Duda con clase para la DB(singleton).

ok , según lo que leí es mejor manejar un patrón registry ?.


saludos
  #6 (permalink)  
Antiguo 05/08/2011, 09:33
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: Duda con clase para la DB(singleton).

Así es.

Saludos.
  #7 (permalink)  
Antiguo 05/08/2011, 10:28
Avatar de RIVERMILLOS  
Fecha de Ingreso: marzo-2010
Mensajes: 1.336
Antigüedad: 14 años, 2 meses
Puntos: 15
Respuesta: Duda con clase para la DB(singleton).

Buscando ejemplo me tope con este , esta bien si lo sigo? o tiene alguna sugerencia de algun ejemplo complete de este patrón?

http://desphpparatodos.blogspot.com/...do-pdo-el.html


saludos
  #8 (permalink)  
Antiguo 05/08/2011, 10:41
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: Duda con clase para la DB(singleton).

ese ejemplo lo vi aqui mismo en el foro, pero sí, básicamente es algo así, un registro donde guardes objetos.

Saludos.
  #9 (permalink)  
Antiguo 05/08/2011, 10:46
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años
Puntos: 1517
Respuesta: Duda con clase para la DB(singleton).

Lo que no me gusto es que en uno de los metodos te añade el &. Cuando en realidad ya no es necesario. Por lo demas hay mas ejemplos en internet, por si quieres seguir aprendiendo y aqui en el foro, busca tambien los que estan en ingles.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #10 (permalink)  
Antiguo 05/08/2011, 10:57
Avatar de RIVERMILLOS  
Fecha de Ingreso: marzo-2010
Mensajes: 1.336
Antigüedad: 14 años, 2 meses
Puntos: 15
Respuesta: Duda con clase para la DB(singleton).

Muchas gracias voy a seguir buscando mas ejemplos.

Pero primero quisiera comentarles como utilizo actualmente las clase singleton, para ver si al cambiarme al registry si sea de utilidad o no, yo actualmente programo en php , pero hago servicios para ser utilizados con amfphp , entonces tengo mis clases(servicios) , entonces en cada servicio tengo en el constructor de la clase el llamado al getInstance() del la clase DB y la utilizo segun el metodo que sea llamado. En este modelo con amfphp tendria algun inconveniente con registry.?


saludos
  #11 (permalink)  
Antiguo 05/08/2011, 11:23
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: Duda con clase para la DB(singleton).

No, simplemente reemplazas tu getInstance por Registry::get('db'); o algo similar.
  #12 (permalink)  
Antiguo 05/08/2011, 14:41
Avatar de RIVERMILLOS  
Fecha de Ingreso: marzo-2010
Mensajes: 1.336
Antigüedad: 14 años, 2 meses
Puntos: 15
Respuesta: Duda con clase para la DB(singleton).

Listo , ya estoy entendiendo mas o menos como funciona , Pero ahora tengo una duda como hago para que el archivo de configuracion .ini no sea visble por el navegador?

slaudos
  #13 (permalink)  
Antiguo 05/08/2011, 14:51
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: Duda con clase para la DB(singleton).

Pues simplemente dejalo fuera de la ruta documentroot y ya.

Saludos.
  #14 (permalink)  
Antiguo 05/08/2011, 15:07
Avatar de RIVERMILLOS  
Fecha de Ingreso: marzo-2010
Mensajes: 1.336
Antigüedad: 14 años, 2 meses
Puntos: 15
Respuesta: Duda con clase para la DB(singleton).

Ok era una pregunta tonta.

Mira estos son una parte de los archivos que estoy usando en los ejemplos de registry.

Código PHP:
Ver original
  1. <?php
  2. error_reporting ( E_ALL );
  3. ini_set("display_errors" , 1 );
  4.  
  5. include("Factory.php");
  6. include("Registry.class.php");
  7. include("Reader.class.php");
  8. include("Db.class.php");
  9.  
  10. class DatabaseFactory implements Factory
  11. {
  12.     public static function create($sIniFile)
  13.     {
  14.         $config  = new Reader($sIniFile);        
  15.         $config_data = $config->getConfig();
  16.         $database_class = key($config_data);
  17.         include($database_class.'.class.php');
  18.         $db = new $database_class($config);
  19.         registry::add($sIniFile, $db);      
  20.         return $db;
  21.     }
  22. }
  23. ?>


Código PHP:
Ver original
  1. <?php
  2.  
  3. final class Mysql extends PDO
  4. {
  5.     private $_username;
  6.     private $_password;
  7.     private $_host;
  8.     private $_db;
  9.  
  10.     public function __construct(Reader $config)
  11.     {
  12.         $config_data = $config->getConfig();
  13.         $this->_username = $config_data['Mysql']['username'];
  14.         $this->_password = $config_data['Mysql']['password'];
  15.         $this->_host     = $config_data['Mysql']['host'];
  16.         $this->_db       = $config_data['Mysql']['dbname'];
  17.         $this->_dsn      = 'mysql:dbname='.$this->_db.';host='.$this->_host;
  18.         parent::__construct($this->_dsn, $this->_username, $this->_password);    
  19.     }
  20.    
  21. }
  22. ?>


Código PHP:
Ver original
  1. <?php
  2.  
  3. /*
  4.  * Clase encargada de gestionar las conexiones a la base de datos
  5.  * @author Esteban Quintero
  6.  */
  7. Class Db{
  8.  
  9.     /*establese la conexion*/
  10.     protected $_conect;
  11.     /*trabaja los query*/
  12.     protected $_query;
  13.     /*resultados de las consultas*/
  14.     protected $_row;
  15.     protected $_result;
  16.  
  17. /**
  18.  * La función construct es privada para evitar que el objeto pueda ser creado mediante new
  19.  **/
  20. function __construct(){
  21.    
  22.     try{
  23.    
  24.         $site_path = '../../includes/DB/config.ini';
  25.         $this->_conect=DatabaseFactory::create($site_path);  
  26.  
  27.     }  catch (Exception $e){
  28.        
  29.        
  30.        
  31.     }
  32. }
  33. /**
  34.  * Método para ejecutar una sentencia sql
  35.  * @param String $sql sentencia sql para ejecutar en la BD.
  36.  *
  37.  **/
  38. public function ejecutar($sql){
  39.    
  40.   try{
  41.        
  42.        $this->sql=$sql;
  43.        
  44.        $this->resulset = $this->_conect->query($sql);
  45.        
  46.        if(!$this->resulset){
  47.            
  48.            error_log("error al ejecutar la consulta ".$sql." funcion ejecutar ",3,"errorlog/Db_log.log");    
  49.        
  50.            
  51.        }
  52.        
  53.    }catch(Exception $e){
  54.         error_log("error al ejecutar la consulta ".$sql." funcion ejecutar ".$e->getMessage(),3,"errorlog/Db_log.log");
  55.    }
  56.    return $this->resulset;
  57. }
  58. /**
  59.  *Método para obtener una fila de resultados de la sentencia sql
  60.  *@param String $resulset resulset del resultado de la sentencia.
  61.  */
  62. public function obtener_fila($resulset){
  63. try{
  64.    if(!$resulset){
  65.      $this->array=array();
  66.    }else{
  67.      $this->array=$resulset->fetchObject();
  68.    }
  69. }catch(Exception $e){
  70.     error_log($e->getMessage()." Clase Db Funcion obtener_fila parametro".$resulset,3,"errorlog/user_log.log");
  71. }
  72. return $this->array;
  73. }
  74. /*
  75.  *Método para obtener las filas de resultados de la sentencia sql
  76.  *@param String $resulset resulset del resultado de la sentencia.
  77.  */
  78. public function obtener_filas($resulset){
  79.     if(!$resulset){
  80.         error_log("Error en la consulta sql :".$this->sql." funcion obtener_filas",3,"errorlog/Db_log.log");
  81.     }else{
  82.     $this->array=$resulset->fetchAll();
  83.     }
  84. return $this->array;
  85. }
  86. /**
  87.  *Método para obtener el numer de  filas del resultado de la sentencia sql
  88.  *@param String $resulset resulset del resultado de la sentencia.
  89.  */
  90. public function numero_filas($resulset){
  91.  try{
  92.      if($resulset){
  93.        
  94.          return $resulset->rowCount();
  95.      
  96.      }else{
  97.        
  98.          return false;
  99.      
  100.      }
  101.  }catch(Exception $e){
  102.    error_log($e->getMessage()." Error al contar los datos sql : ".$this->sql."funcion numero_filas -> @param ".$resulset,3,"errorlog/Db_log.log");
  103.  }
  104. }
  105. /**
  106.  *Inicia una trasaccion
  107.  **/
  108. public function startTransaction(){
  109.   $this->_conect->beginTransaction();
  110. }
  111. /**
  112.  * Confirma una trasaccion
  113.  **/
  114. public function commit(){
  115.    $this->_conect->commit();
  116. }
  117. /**
  118.  * Elimina una trasaccion
  119.  **/
  120. public function rollBack(){
  121.   $this->_conect->rollBack();
  122. }
  123. /**
  124.  *Ejecuta una trasaccion
  125.  *@param String $sql sentencia a ejecutar en le servidor.
  126.  */
  127. public function exec($sql){
  128.  try{
  129.   $this->_conect->exec($sql);
  130.  }catch (Exception $e){
  131.   error_log("Error al ejecutar sql :".$sql."funcion exec",3,"errorlog/Db_log.log");
  132.  }
  133. }
  134. /**
  135.  *retorna el ultimo id ingresado.
  136.  **/
  137. public function lastInsertId(){
  138. return $this->_conect->lastInsertId();
  139. }
  140. /**
  141.  * Prepara un a sentencia SQL
  142.  */
  143. public function prepare($sql){
  144.    
  145.  $stmt = $this->_conect->prepare($sql);
  146.  return $stmt;
  147. }
  148.  
  149. }
  150. ?>

todo es funcionado , bien lo unico es que no entiendo como recojo la instancia de la clase ya creada. es registry::get() , pero no comprendo el parametro que le deberia pasar.


porque lo coloco asi y me retorna la instancia de Mysql

$x = registry::get('../../includes/DB/config.ini');


saludos
  #15 (permalink)  
Antiguo 08/08/2011, 14:41
Avatar de RIVERMILLOS  
Fecha de Ingreso: marzo-2010
Mensajes: 1.336
Antigüedad: 14 años, 2 meses
Puntos: 15
Respuesta: Duda con clase para la DB(singleton).

Si hago esto otra vez.

Código PHP:
Ver original
  1. $site_path = '../../includes/DB/config.ini';
  2.         $this->_conect=DatabaseFactory::create($site_path);


estaria creando otra instancia?


saludos
  #16 (permalink)  
Antiguo 08/08/2011, 15:06
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: Duda con clase para la DB(singleton).

Si, porque a tu clase DbFactory le faltaría revisar en el registro si existe o no la instancia antes de crearla.

Saludos.
  #17 (permalink)  
Antiguo 08/08/2011, 15:27
Avatar de RIVERMILLOS  
Fecha de Ingreso: marzo-2010
Mensajes: 1.336
Antigüedad: 14 años, 2 meses
Puntos: 15
Respuesta: Duda con clase para la DB(singleton).

Listo lo que hice ahora fue esto.

DbFactory

Código PHP:
Ver original
  1. public static function create($sIniFile)
  2.     {
  3.         $config  = new Reader($sIniFile);  
  4.        
  5.         $config_data = $config->getConfig();
  6.        
  7.         $database_class = key($config_data);
  8.        
  9.         include($database_class.'.class.php');
  10.        
  11.         if(Registry::has($sIniFile))
  12.         {
  13.            
  14.             return Registry::get($sIniFile);
  15.            
  16.         }else{
  17.            
  18.             $db = new $database_class($config);
  19.            
  20.             Registry::set($sIniFile, $db);  
  21.            
  22.             return $db;  
  23.            
  24.         }
  25.        
  26.  
  27.     }


Y Cambie el registry por uno que tu hiciste en otro post

Código PHP:
Ver original
  1. <?php
  2.     class Registry {
  3.         private $_cache;
  4.        
  5.         public function __construct() {
  6.             $this->_cache = array();
  7.         }
  8.         public function set($key, &$item) {
  9.             $this->_cache[$key] = &$item;
  10.         }
  11.         public function get($key) {
  12.             return $this->_cache[$key];
  13.         }
  14.         public function has($key) {
  15.             return ($this->get($key) !== null);
  16.         }
  17.     }
  18.  ?>

hay creeria que ya no se crea una nueva.

Si?

saludos
  #18 (permalink)  
Antiguo 08/08/2011, 16:01
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: Duda con clase para la DB(singleton).

Sí se ve mejor aunque yo no haría el parsing de la configuración si ya tienes el elemento en el registro...
  #19 (permalink)  
Antiguo 09/08/2011, 07:13
Avatar de RIVERMILLOS  
Fecha de Ingreso: marzo-2010
Mensajes: 1.336
Antigüedad: 14 años, 2 meses
Puntos: 15
Respuesta: Duda con clase para la DB(singleton).

Si claro no seria necesario. Muchas gracias


saludos
  #20 (permalink)  
Antiguo 09/08/2011, 07:54
Avatar de RIVERMILLOS  
Fecha de Ingreso: marzo-2010
Mensajes: 1.336
Antigüedad: 14 años, 2 meses
Puntos: 15
Respuesta: Duda con clase para la DB(singleton).

Lo modifique asi para que no hiciera el parsing,

Código PHP:
Ver original
  1. if(Registry::has($sIniFile))
  2.         {
  3.            
  4.             return Registry::get($sIniFile);
  5.            
  6.         }else
  7.          {
  8.            
  9.             $config  = new Reader($sIniFile);  
  10.        
  11.             $config_data = $config->getConfig();
  12.  
  13.             $database_class = key($config_data);
  14.  
  15.             include($database_class.'.class.php');
  16.            
  17.             $db = new $database_class($config);
  18.            
  19.             Registry::set($sIniFile, $db);  
  20.            
  21.             return $db;  
  22.            
  23.          }

pero tengo el siguiente error.



[09-Aug-2011 09:53:53] PHP Fatal error: Using $this when not in object context in Registry.class.php on line 19



saludos
  #21 (permalink)  
Antiguo 09/08/2011, 08:02
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: Duda con clase para la DB(singleton).

Pues si ves la clase Registry no es estatica, tienes que instanciarla para leer las propiedades de la clase, por eso te marca error.

Saludos.
  #22 (permalink)  
Antiguo 09/08/2011, 08:05
Avatar de RIVERMILLOS  
Fecha de Ingreso: marzo-2010
Mensajes: 1.336
Antigüedad: 14 años, 2 meses
Puntos: 15
Respuesta: Duda con clase para la DB(singleton).

Ok , ahora la instancie , pero tengo una duda si vuelvo a llamar a eso el array $this->_cache quedaria nulo y siempre me retornaria una nueva.

Código PHP:
Ver original
  1. $Registry = new Registry();
  2.        
  3.         if ( ! $Registry->has( 'conexion' ) ) {
  4.            
  5.             $db = new $database_class( $config );
  6.            
  7.             $Registry->set( 'conexion' , $db );
  8.            
  9.         }
  10.  
  11.         $db = $Registry->get( 'conexion' );
  12.        
  13.         return $db;


saludos.
  #23 (permalink)  
Antiguo 09/08/2011, 09:19
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: Duda con clase para la DB(singleton).

Cierto, es mejor que la hagas estatica, algo así:
Código PHP:
Ver original
  1. <?php
  2. class Registry
  3. {
  4.     private static $_registry = array();
  5.    
  6.     private function __construct(){}
  7.    
  8.     public static function has($entry)
  9.     {
  10.         return (isset(self::$_registry[$entry]));
  11.     }
  12.    
  13.     public static function set($entry, $value)
  14.     {
  15.         self::$_registry[$entry] = $value;
  16.     }
  17.    
  18.     public static function get($entry)
  19.     {
  20.         if (self::has($entry)) {
  21.             return self::$_registry[$entry];
  22.         } else {
  23.             return null;
  24.         }
  25.     }
  26.    
  27.     public static function clear()
  28.     {
  29.         self::$_registry = array();
  30.     }
  31. }

Saludos.

Etiquetas: clase, 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 14:41.