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

Intentando entender la clase mysql

Estas en el tema de Intentando entender la clase mysql en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Buenas, A raiz del post de nuestro compañero eulerss http://www.forosdelweb.com/f68/clase...1/#post3275707 Me sale una duda, que para no ensuciar su hilo abro este nuevo hilo, con ...
  #1 (permalink)  
Antiguo 10/02/2010, 16:00
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Intentando entender la clase mysql

Buenas,

A raiz del post de nuestro compañero eulerss

http://www.forosdelweb.com/f68/clase...1/#post3275707

Me sale una duda, que para no ensuciar su hilo abro este nuevo hilo, con una nueva clase mysql que utiliza el patron singleton al cual quiero aplicar el último comentario de maturano

class-mysql.php
Código PHP:
Ver original
  1. <?php
  2.  
  3. class DataBase {
  4.  
  5.     private $conexion;
  6.     private $resource;
  7.     private $sql;
  8.     public static $queries;
  9.     private static $_singleton;
  10.  
  11.     public static function getInstance(){
  12.         if (is_null (self::$_singleton)) {
  13.             self::$_singleton = new DataBase();
  14.         }
  15.         return self::$_singleton;
  16.     }
  17.  
  18.     private function __construct($servidor, $user, $password, $db){
  19.         $this->conexion = @mysql_connect($servidor, $user, $password);
  20.         mysql_select_db($db, $this->conexion);
  21.         $this->queries = 0;
  22.         $this->resource = null;
  23.     }
  24.  
  25.     public function execute(){
  26.         if(!($this->resource = mysql_query($this->sql, $this->conexion))){
  27.             return null;
  28.         }
  29.         $this->queries++;
  30.         return $this->resource;
  31.     }
  32.  
  33.     public function alter(){
  34.         if(!($this->resource = mysql_query($this->sql, $this->conexion))){
  35.             return false;
  36.         }
  37.         return true;
  38.     }
  39.  
  40.     public function loadObjectList(){
  41.         if (!($cur = $this->execute())){
  42.             return null;
  43.         }
  44.         $array = array();
  45.         while ($row = @mysql_fetch_object($cur)){
  46.             $array[] = $row;
  47.         }
  48.         return $array;
  49.     }
  50.  
  51.     public function setQuery($sql){
  52.         if(empty($sql)){
  53.             return false;
  54.         }
  55.         $this->sql = $sql;
  56.         return true;
  57.     }
  58.  
  59.     public function freeResults(){
  60.         @mysql_free_result($this->resource);
  61.         return true;
  62.     }
  63.  
  64.     public function loadObject(){
  65.         if ($cur = $this->execute()){
  66.             if ($object = mysql_fetch_object($cur)){
  67.                 @mysql_free_result($cur);
  68.                 return $object;
  69.             }
  70.             else {
  71.                 return null;
  72.             }
  73.         }
  74.         else {
  75.             return false;
  76.         }
  77.     }
  78.  
  79.     function __destruct(){
  80.         @mysql_free_result($this->resource);
  81.         @mysql_close($this->conexion);
  82.     }
  83. }
  84. ?>

Ejemplo script llamando a la clase

Código PHP:
Ver original
  1. <?php
  2. include('class-mysql.php');
  3.  
  4. // Hacemos la conexión
  5. $db = new DataBase('localhost','root','pass12421','mibasededatos');
  6. $db = DataBase::getInstance();
  7.  
  8. // Supongamos que tenemos una tabla de usuarios
  9. // Hacemos la consulta:
  10. $db->setQuery("SELECT * FROM wp_posts");
  11.  
  12. // La ejecutamos y al mismo tiempo obtenemos un arreglo de objetos
  13. // con los campos especificados en la consulta como propiedades.
  14. $usuarios = $db->loadObjectList();
  15.  
  16. // Los imprimimos directamente en pantalla...
  17. foreach($usuarios as $usuario){
  18.     echo 'ID: '.$usuario->ID;
  19.     echo 'Nombre: '.$usuario->post_name;
  20.     echo 'Grupo: '.$usuario->post_status;
  21.     echo '<br />';
  22. }
  23.  
  24. ?>

Tengo que decir que las lineas 18,19 y 20 de la clase no estaban así sino que no se le pasaba ningun parametro... Los he puesto yo para que sea mas reusable. Entonces me preguntaba como llamar a la clase, estoy casi seguro que si no tuviese el patron singleton lo podría hacer así
$db = new DataBase('localhost','root','pass12421','mibaseded atos');

Pero lo tiene y no se como crear la clase y que se aplique el patron singleton... me pierdo un poco.

El error que me da al ejecutar el script, es que revise la linea 5 del script precisamente esta
$db = new DataBase('localhost','root','pass12421','mibaseded atos');

¿Qué me falta para acabar de encajar este rompezabezas?

Muchas gracias de antemano, estoy aprendiendo mucho con vuestros comentarios
  #2 (permalink)  
Antiguo 10/02/2010, 16: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: Intentando entender la clase mysql

Lo que pasa es que tienes que pasar esos parámetros a la clase vía el Singleton, la idea del Singleton es solo tener una instancia, ve este ejemplo:
Código PHP:
Ver original
  1. class Singleton {
  2.        private static $_instance;
  3.        private $_var;
  4.  
  5.        public static function getInstance($var = '')
  6.        {
  7.                if (self::$_instance == null ) {
  8.                       self::$_instance = new self($var);
  9.                }
  10.  
  11.                return self::$_instance;
  12.        }
  13.  
  14.        private function __construct($var = '')
  15.        {
  16.               $this->_var = $var;
  17.        }
  18.  
  19.        public function printVar()
  20.        {
  21.                echo $this->_var;
  22.        }
  23. }
  24.  
  25. $obj = Singleton::getInstance("hola");
  26. $obj->printVar(); // imprime hola
  27.  
  28. $obj2 = Singleton::getInstance();
  29. $obj2->printVar(); // imprime hola
  30.  
  31. $obj3 = Singleton::getInstance("bye");
  32. $obj3->printVar(); // sigue imprimiendo hola

La idea de Singleton es que no se pueda construir así tienes solo una instancia global.

Saludos.
  #3 (permalink)  
Antiguo 10/02/2010, 18:47
Avatar de maturano  
Fecha de Ingreso: enero-2010
Ubicación: /home/
Mensajes: 537
Antigüedad: 14 años, 3 meses
Puntos: 36
Respuesta: Intentando entender la clase mysql

Cita:
Iniciado por neodani Ver Mensaje
El error que me da al ejecutar el script, es que revise la linea 5 del script precisamente esta
$db = new DataBase('localhost','root','pass12421','mibaseded atos');
Primero que todo, cuando aparezcan errores, muestra exactamente cuales son. Sí te dice que veas la línea 5, pero no nos dices por qué, cuál es el error exacto.

Eso solo como consejo/petición al comunicar problemas.



Cita:
Iniciado por neodani Ver Mensaje
Me sale una duda, que para no ensuciar su hilo abro este nuevo hilo, con una nueva clase mysql que utiliza el patron singleton al cual quiero aplicar el último comentario de maturano
(...)
Entonces me preguntaba como llamar a la clase, estoy casi seguro que si no tuviese el patron singleton lo podría hacer así
$db = new DataBase('localhost','root','pass12421','mibaseded atos');

Pero lo tiene y no se como crear la clase y que se aplique el patron singleton... me pierdo un poco.
En mi último comentario hablaba exclusivamente de la función del constructor, no aplicaba el patrón singleton. También mencioné leyeras los enlaces que he dejado. Extraído de www.php.net/singleton (que dejé cuando sí hablaba de Singleton):
Código PHP:
Ver original
  1. class Example
  2. {
  3.     // ...
  4.    
  5.     // OJO: A private constructor; prevents direct creation of object
  6.     private function __construct()
  7.     {
  8.         echo 'I am constructed';
  9.     }
  10.     // ...
  11. }
  12.  
  13.  
  14. // Y más adelante, en su implementación:
  15.  
  16. // OJO: This would fail because the constructor is private
  17. $test = new Example;
  18.  
  19. // This will always retrieve a single instance of the class
  20. $test = Example::singleton();
  21. $test->bark();

Con singleton la idea es no utilizar el operador new, lo utilizas dos veces y tienes dos instancias, no tienes control sobre ello. Para tener el control se especifica como privado el método constructor y manejas la creación/recuperación de la instancia a través de un método.

Te falta fusionar las ideas. Tu código:
Código PHP:
Ver original
  1. // Hacemos la conexión
  2. $db = new DataBase('localhost','root','pass12421','mibasededatos');
  3. $db = DataBase::getInstance(); // ¡Sobre-escribes inmediatamente después!

¿No el método getInstance() es el que recupera/crea la instancia?. Fusionando:
Código PHP:
Ver original
  1. // Hacemos la conexión
  2. $db = DataBase::getInstance('localhost','root','pass12421','mibasededatos');

¿Mejor?. Espero quede claro ahora.
__________________
I ♥ The Music!
  #4 (permalink)  
Antiguo 11/02/2010, 00:59
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Respuesta: Intentando entender la clase mysql

Buenas,

Muchas gracias por las explicaciones, las intento aplicar pero no tengo éxito. Creo que me falta una cosa.

Este es el código de la clase. Si os fijáis he añadido en la linea 13 y 18 los parámetros y me dice lo siguiente:


Código:
Warning: mysql_select_db(): supplied argument is not a valid MySQL-Link resource in C:\AppServ\www\00-laboratorio_test\secciones\mysql\clase_mysql_1\class-mysql.php on line 20

Warning: mysql_query(): supplied argument is not a valid MySQL-Link resource in C:\AppServ\www\00-laboratorio_test\secciones\mysql\clase_mysql_1\class-mysql.php on line 26

Warning: Invalid argument supplied for foreach() in C:\AppServ\www\00-laboratorio_test\secciones\mysql\clase_mysql_1\ejemplo.php on line 16

Clase
Código PHP:
Ver original
  1. <?php
  2.  
  3. class DataBase {
  4.  
  5.     private $conexion;
  6.     private $resource;
  7.     private $sql;
  8.     public static $queries;
  9.     private static $_singleton;
  10.  
  11.     public static function getInstance(){
  12.         if (is_null (self::$_singleton)) {
  13.             self::$_singleton = new DataBase($servidor, $user, $password, $db);
  14.         }
  15.         return self::$_singleton;
  16.     }
  17.  
  18.     private function __construct($servidor, $user, $password, $db){
  19.         $this->conexion = @mysql_connect($servidor, $user, $password);
  20.         mysql_select_db($db, $this->conexion);
  21.         $this->queries = 0;
  22.         $this->resource = null;
  23.     }
  24.  
  25.     public function execute(){
  26.         if(!($this->resource = mysql_query($this->sql, $this->conexion))){
  27.             return null;
  28.         }
  29.         $this->queries++;
  30.         return $this->resource;
  31.     }
  32.  
  33.     public function alter(){
  34.         if(!($this->resource = mysql_query($this->sql, $this->conexion))){
  35.             return false;
  36.         }
  37.         return true;
  38.     }
  39.  
  40.     public function loadObjectList(){
  41.         if (!($cur = $this->execute())){
  42.             return null;
  43.         }
  44.         $array = array();
  45.         while ($row = @mysql_fetch_object($cur)){
  46.             $array[] = $row;
  47.         }
  48.         return $array;
  49.     }
  50.  
  51.     public function setQuery($sql){
  52.         if(empty($sql)){
  53.             return false;
  54.         }
  55.         $this->sql = $sql;
  56.         return true;
  57.     }
  58.  
  59.     public function freeResults(){
  60.         @mysql_free_result($this->resource);
  61.         return true;
  62.     }
  63.  
  64.     public function loadObject(){
  65.         if ($cur = $this->execute()){
  66.             if ($object = mysql_fetch_object($cur)){
  67.                 @mysql_free_result($cur);
  68.                 return $object;
  69.             }
  70.             else {
  71.                 return null;
  72.             }
  73.         }
  74.         else {
  75.             return false;
  76.         }
  77.     }
  78.  
  79.     function __destruct(){
  80.         @mysql_free_result($this->resource);
  81.         @mysql_close($this->conexion);
  82.     }
  83. }
  84. ?>

Script

Código PHP:
Ver original
  1. <?php
  2. include('class-mysql.php');
  3.  
  4. // Hacemos la conexión
  5. $db = DataBase::getInstance('localhost','root','pass12421','mibasededatos');
  6.  
  7. // Supongamos que tenemos una tabla de usuarios
  8. // Hacemos la consulta:
  9. $db->setQuery("SELECT * FROM wp_posts");
  10.  
  11. // La ejecutamos y al mismo tiempo obtenemos un arreglo de objetos
  12. // con los campos especificados en la consulta como propiedades.
  13. $usuarios = $db->loadObjectList();
  14.  
  15. // Los imprimimos directamente en pantalla...
  16. foreach($usuarios as $usuario){
  17.     echo 'ID: '.$usuario->ID;
  18.     echo 'Nombre: '.$usuario->post_name;
  19.     echo 'Grupo: '.$usuario->post_status;
  20.     echo '<br />';
  21. }
  22.  
  23. ?>

Qué es lo que falta para que acabe de funcionar esto? :S

Muchas gracias por vuestra ayuda!
  #5 (permalink)  
Antiguo 11/02/2010, 08:09
Avatar de _ssx  
Fecha de Ingreso: mayo-2003
Ubicación: mX
Mensajes: 683
Antigüedad: 21 años
Puntos: 60
Respuesta: Intentando entender la clase mysql

Te falta agregar los parámetros al método getInstance por que no le estas pasando las variables al constructor.


Tienes esto.

Código PHP:
public static function getInstance(){
        if (
is_null (self::$_singleton)) {
            
self::$_singleton = new DataBase($servidor$user$password$db);
        }
        return 
self::$_singleton;
    } 
Podría ser así.

Código PHP:
public static function getInstance($servidor$user$password$db){
        if (
is_null (self::$_singleton)) {
            
self::$_singleton = new DataBase($servidor$user$password$db);
        }
        return 
self::$_singleton;
    } 
__________________
Escribe tu código de forma que refleje, y saque a relucir,lo mejor de tu carácter personal
www.oscararzola.com/blog
Principios de un programador
  #6 (permalink)  
Antiguo 11/02/2010, 09:22
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Intentando entender la clase mysql

otra opción, es crear un método alternativo y dejar el singleton tal cual...

Código PHP:
function connect($host$user$pass$db)
{
  
// ...
}

// ...

$foo bar::instance();
$foo->connect(/*... */); 
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #7 (permalink)  
Antiguo 11/02/2010, 13:44
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Respuesta: Intentando entender la clase mysql

Cita:
Iniciado por _ssx Ver Mensaje
Te falta agregar los parámetros al método getInstance por que no le estas pasando las variables al constructor.


Tienes esto.

Código PHP:
public static function getInstance(){
        if (
is_null (self::$_singleton)) {
            
self::$_singleton = new DataBase($servidor$user$password$db);
        }
        return 
self::$_singleton;
    } 
Podría ser así.

Código PHP:
public static function getInstance($servidor$user$password$db){
        if (
is_null (self::$_singleton)) {
            
self::$_singleton = new DataBase($servidor$user$password$db);
        }
        return 
self::$_singleton;
    } 
Ostras es verdad! que tonto no lo vi

La opción de pateketrueke tb es válida pero ya son dos lineas, creo que así queda mas compacto...

Lo dejaré así en 1 sola linea

Muchas gracias por vuestra ayuda!
  #8 (permalink)  
Antiguo 11/02/2010, 14:56
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: Intentando entender la clase mysql

Yo dejaría los parámetros como opcionales así solo los usas una vez para crear el objeto y las proximas veces solo usas getInstance() sin parámetros para ahorrar código
  #9 (permalink)  
Antiguo 11/02/2010, 17:00
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Respuesta: Intentando entender la clase mysql

Cita:
Iniciado por GatorV Ver Mensaje
Yo dejaría los parámetros como opcionales así solo los usas una vez para crear el objeto y las proximas veces solo usas getInstance() sin parámetros para ahorrar código
Uhm estoy un poco espeso a estas horas GatorV, no acabo de entender a lo que te refieres con dejar los parámetros como opcionales...

¿Te refieres al patron singleton dejarlo sin $servidor, $user, $password, $db?

Código PHP:
Ver original
  1. public static function getInstance($servidor, $user, $password, $db){
  2.         if (is_null (self::$_singleton)) {
  3.             self::$_singleton = new DataBase($servidor, $user, $password, $db);
  4.         }
  5.         return self::$_singleton;
  6.     }

Y crear el metodo como decia pateketrueke?

Salu2!
  #10 (permalink)  
Antiguo 11/02/2010, 17:24
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: Intentando entender la clase mysql

No, me refiero a esto:
Código PHP:
Ver original
  1. public static function getInstance($servidor = '', $user = '', $password = '', $db = ''){
  2.         if (is_null (self::$_singleton)) {
  3.             self::$_singleton = new DataBase($servidor, $user, $password, $db);
  4.         }
  5.         return self::$_singleton;
  6.     }

Así lo puedes llamar la primera vez:
Código PHP:
Ver original
  1. $conn = DB::getInstance($server, $user, $password, $db);
  2. // Mas adelante
  3. $conn = DB::getInstance();

Saludos.
  #11 (permalink)  
Antiguo 12/02/2010, 00:43
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Respuesta: Intentando entender la clase mysql

Cita:
Iniciado por GatorV Ver Mensaje
No, me refiero a esto:
Código PHP:
Ver original
  1. public static function getInstance($servidor = '', $user = '', $password = '', $db = ''){
  2.         if (is_null (self::$_singleton)) {
  3.             self::$_singleton = new DataBase($servidor, $user, $password, $db);
  4.         }
  5.         return self::$_singleton;
  6.     }

Así lo puedes llamar la primera vez:
Código PHP:
Ver original
  1. $conn = DB::getInstance($server, $user, $password, $db);
  2. // Mas adelante
  3. $conn = DB::getInstance();

Saludos.
Pero si lo haces así, la primera vez guay porque le pasas los parámetros y gracias al constructor te conectará con la base de datos automáticamente, pero con la segunda llamada que consigues? si no le pasas los parámetros no podrá conectarse a la base de datos...

Si he entendido bien el patron singleton haría mas o menos así:

Con la primera linea mira si existe el recurso sino existe ninguna instancia abierta la crea por primera vez, trabajas con ella, etc... y si vuelves hacer la misma llamada pasandole los mismos datos, comprueba que ya existe una instancia que se llama así, por lo que la aprovechará. Ahora bien, si los datos de conexión a la hora de llamar a la nueva instancia han cambiado entiendo que te crea una segunda instancia diferente no?

Que consigues llamando a la instancia con la segunda forma, sin pasarle los datos? quieres decir que es capaz de detectar que existe una instancia lanzada y por eso no hace falta pasarle los datos? en ese caso que sentido lanzar esa linea, porque no utilizas algun metodo de la clase para hacer cosas...

No acabo de entender la utilidad de volverla a llamar sin opciones...

Gracias!
  #12 (permalink)  
Antiguo 12/02/2010, 01:06
Avatar de maturano  
Fecha de Ingreso: enero-2010
Ubicación: /home/
Mensajes: 537
Antigüedad: 14 años, 3 meses
Puntos: 36
Respuesta: Intentando entender la clase mysql

No puedo creer que a esta altura, se siga sin entender.

Singleton:
- Tiene como propósito manejar UNA MISMA instancia de un objeto.
- ¿Cómo funciona?
- A través de un método que cuando es llamado comprueba si una propiedad interna es una instancia de la propia clase. Si no lo es, crea una nueva instancia y la guarda en dicha propiedad, si sí lo es, retorna esa instancia.

Hasta ahí, sin parámetros ni nada; ahí queda singleton.

En tu clase, quieres pasar argumentos en tu constructor, es solo por eso que los pasas una primera vez, porque cuando cree la instancia los necesitará, pero para un segundo llamado, la instancia ya estará creada, solo la va a retornar ...

Es realmente simple, un patrón sencillo.

Al comienzo GatorV dejó un código más que claro y sencillo. Ejecuta el método que hace el trabajo con otros argumentos y sin ellos y muestra como siempre regresa la misma instancia. Dale su tiempo para entenderlo.
__________________
I ♥ The Music!
  #13 (permalink)  
Antiguo 12/02/2010, 11:12
Avatar de _ssx  
Fecha de Ingreso: mayo-2003
Ubicación: mX
Mensajes: 683
Antigüedad: 21 años
Puntos: 60
Respuesta: Intentando entender la clase mysql




Solo como dice maturano date el tiempo de entender el getInstance en el if esta todo lo que necesitas entender.

Código PHP:
public static function getInstance($servidor$user$password$db){
        if (
is_null (self::$_singleton)) {
            
self::$_singleton = new DataBase($servidor$user$password$db);
        }
        return 
self::$_singleton;
    } 
__________________
Escribe tu código de forma que refleje, y saque a relucir,lo mejor de tu carácter personal
www.oscararzola.com/blog
Principios de un programador
  #14 (permalink)  
Antiguo 13/02/2010, 04:57
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Respuesta: Intentando entender la clase mysql

Cita:
Iniciado por _ssx Ver Mensaje



Solo como dice maturano date el tiempo de entender el getInstance en el if esta todo lo que necesitas entender.

Código PHP:
public static function getInstance($servidor$user$password$db){
        if (
is_null (self::$_singleton)) {
            
self::$_singleton = new DataBase($servidor$user$password$db);
        }
        return 
self::$_singleton;
    } 
Sí he entendido el significado de singleton, pero mi última duda era (si queréis cojo el ejemplo de GatorV)

Código PHP:
Ver original
  1. class Singleton {
  2.        private static $_instance;
  3.        private $_var;
  4.  
  5.        public static function getInstance($var = '')
  6.        {
  7.                if (self::$_instance == null ) {
  8.                       self::$_instance = new self($var);
  9.                }
  10.  
  11.                return self::$_instance;
  12.        }
  13.  
  14.        private function __construct($var = '')
  15.        {
  16.               $this->_var = $var;
  17.        }
  18.  
  19.        public function printVar()
  20.        {
  21.                echo $this->_var;
  22.        }
  23. }
  24.  
  25. $obj = Singleton::getInstance("hola");
  26. $obj->printVar(); // imprime hola
  27.  
  28. $obj2 = Singleton::getInstance();
  29. $obj2->printVar(); // imprime hola
  30.  
  31. $obj3 = Singleton::getInstance("bye");
  32. $obj3->printVar(); // sigue imprimiendo hola


En los 3 casos imprime hola porque fue como se llamo la primera vez. Esto es lo mismo si la primera vez te conectas a una base de datos especifica.
Mi duda era que pasa si quieres conectarte a otra base de datos diferente (o en el ej. de GatorV, que pasa si quieres te te escriba bye en lugar de hola?)

Esa era mi duda mi reflexión del último post... como dijo a la clase que lo que estoy llamando es una nueva conexión a otra base de datos. Por que me extrañaría que no se pudiera. ¿Se haría con un metodo? ¿No habría dos conexiones abiertas a dos base de datos distintas?

Salu2!
  #15 (permalink)  
Antiguo 13/02/2010, 13:30
Avatar de maturano  
Fecha de Ingreso: enero-2010
Ubicación: /home/
Mensajes: 537
Antigüedad: 14 años, 3 meses
Puntos: 36
Respuesta: Intentando entender la clase mysql

Cita:
Iniciado por neodani Ver Mensaje
Ahora bien, si los datos de conexión a la hora de llamar a la nueva instancia han cambiado entiendo que te crea una segunda instancia diferente no?
Eso es una duda puntual sobre el comportamiento del patrón Singleton, y la respuesta es un NO. Es muy diferente a cuando dices esto:

Cita:
Iniciado por neodani Ver Mensaje
Esa era mi duda mi reflexión del último post... como dijo a la clase que lo que estoy llamando es una nueva conexión a otra base de datos. Por que me extrañaría que no se pudiera. ¿Se haría con un metodo? ¿No habría dos conexiones abiertas a dos base de datos distintas?
Este ya estás planteando el "deseo" de un comportamiento de tu clase, es otro tema muy aparte, fuera de Singleton; y no, en tu último post dijiste otra cosa.

¿Se puede?, ¡Claro!. ¿Un nuevo método?, ¿diferenciar por parámetros?, ¿se ha de cerrar la conexión si había una?, ¿se mantienen las dos?, ¿un nuevo parámetro para indicar que es una nueva conexión? ... Ya tienes que resolver esos problemas, el cómo, el comportamiento que tenga dependerá de ti.

Puedes, por ejemplo (algo pensando no querer salir de la clase que ya se tiene) tener un array de instancias, y guardar los parámetros con los que se creó esa instancia manteniendo la asociación. Luego podrás comparar si son los mismos parámetros y crear o recuperar la conexión, o identificarlas por algún otro parámetro, o crear otra clase para manejar tus conexiones.

Adivino ahora tienes en mente la primera posibilidad que plantee. Te invito a intentarlo y a observar el comportamiento de clases ya existentes que abstraen las conexiones a BDs.
__________________
I ♥ The Music!

Etiquetas: singleton, tutoriales
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 03:16.