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

Duda patron singleton

Estas en el tema de Duda patron singleton en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Saludos, he estado buscando como implementar el patrón singleton a mi código a la hora de hacer conexiones a la base de datos. He encontrado ...
  #1 (permalink)  
Antiguo 11/02/2013, 09:14
Avatar de Fylux  
Fecha de Ingreso: junio-2012
Mensajes: 141
Antigüedad: 12 años, 4 meses
Puntos: 9
Pregunta Duda patron singleton

Saludos, he estado buscando como implementar el patrón singleton a mi código a la hora de hacer conexiones a la base de datos.
He encontrado este ejemplo: http://www.cristalab.com/tutoriales/...n-php-c63332l/
Código PHP:
/* Clase encargada de gestionar las conexiones a la base de datos */
Class Db{

   private 
$servidor='localhost';
   private 
$usuario='user';
   private 
$password='test';
   private 
$base_datos='testDB';
   private 
$link;
   private 
$stmt;
   private 
$array;

   static 
$_instance;

   
/*La función construct es privada para evitar que el objeto pueda ser creado mediante new*/
   
private function __construct(){
      
$this->conectar();
   }

   
/*Evitamos el clonaje del objeto. Patrón Singleton*/
   
private function __clone(){ }

   
/*Función encargada de crear, si es necesario, el objeto. Esta es la función que debemos llamar desde fuera de la clase para instanciar el objeto, y así, poder utilizar sus métodos*/
   
public static function getInstance(){
      if (!(
self::$_instance instanceof self)){
         
self::$_instance=new self();
      }
      return 
self::$_instance;
   }

   
/*Realiza la conexión a la base de datos.*/
   
private function conectar(){
      
$this->link=mysql_connect($this->servidor$this->usuario$this->password);
      
mysql_select_db($this->base_datos,$this->link);
      @
mysql_query("SET NAMES 'utf8'");
   }

   
/*Método para ejecutar una sentencia sql*/
   
public function ejecutar($sql){
      
$this->stmt=mysql_query($sql,$this->link);
      return 
$this->stmt;
   }

   
/*Método para obtener una fila de resultados de la sentencia sql*/
   
public function obtener_fila($stmt,$fila){
      if (
$fila==0){
         
$this->array=mysql_fetch_array($stmt);
      }else{
         
mysql_data_seek($stmt,$fila);
         
$this->array=mysql_fetch_array($stmt);
      }
      return 
$this->array;
   }

   
//Devuelve el último id del insert introducido
   
public function lastID(){
      return 
mysql_insert_id($this->link);
   }

}
?> 
El problema que le veo es que para hacer un query tengo que hacerlo con un método. Por ejemplo yo cuando uso mysqli uso mysqli->query(); El problema es que para esto debo crear yo manualmente un método llamado query. Pero tanto para esto como para fetch array.
¿No habría forma de seguir usando el patrón para que no me creara conexiones de más pero que me permita usar directamente la clase mysqli?

Saludos.
__________________
Si todos escribiéramos sin faltas de ortografía, el mundo sería un lugar mejor.

Última edición por Fylux; 11/02/2013 a las 09:40
  #2 (permalink)  
Antiguo 11/02/2013, 11:10
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años, 7 meses
Puntos: 2534
Respuesta: Duda patron singleton

Claro que es posible, pero entonces debes aplicar otro patrón: Proxy.

De manera automática no es posible, pero usando un proxy puedes ejecutar lo que desees usando métodos mágicos.

Código PHP:
class DB
{
  private static 
$mysql;

  public static function 
__callStatic($method$arguments)
  {
    return 
call_user_func_array(array(static::$mysql$method), $arguments);
  }

  private static function 
instance()
  {
    if (! static::
$mysql) {
      static::
$mysql /* conexión usando objetos */;
    }

    return static::
$mysql;
  }

Que claro, para esto debes usar la versión OOP de la conexión en cuestión, de preferencia hay que usar PDO.

Usando funciones mysql_connect() y así también se puede, pero requiere un poco más de esfuerzo.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 11/02/2013, 11:38
Avatar de Fylux  
Fecha de Ingreso: junio-2012
Mensajes: 141
Antigüedad: 12 años, 4 meses
Puntos: 9
Respuesta: Duda patron singleton

Cita:
Iniciado por pateketrueke Ver Mensaje
Claro que es posible, pero entonces debes aplicar otro patrón: Proxy.

De manera automática no es posible, pero usando un proxy puedes ejecutar lo que desees usando métodos mágicos.

Código PHP:
class DB
{
  private static 
$mysql;

  public static function 
__callStatic($method$arguments)
  {
    return 
call_user_func_array(array(static::$mysql$method), $arguments);
  }

  private static function 
instance()
  {
    if (! static::
$mysql) {
      static::
$mysql /* conexión usando objetos */;
    }

    return static::
$mysql;
  }

Que claro, para esto debes usar la versión OOP de la conexión en cuestión, de preferencia hay que usar PDO.

Usando funciones mysql_connect() y así también se puede, pero requiere un poco más de esfuerzo.
Gracias por el aporte.
También he encontrado este que lo acabo de usar y me va bien, ¿es correcto?
Código PHP:
<?php
class DB
{
private static 
$dbLink;

private function 
__construct() {}
private function 
__clone() {}

public static function 
Get()
{
    if(!
self::$dbLink)
    {
        
self::$dbLink = new mysqli(DB_HOST,SQL_USER,SQL_PASS,DB_NAME);
        
self::$dbLink->set_charset(DB_CHARSET);
        if(
mysqli_connect_errno())
        {
            throw new 
Exception("Database connection failed: ".mysqli_connect_error());
        }
    }
    return 
self::$dbLink;
    }
}
?>
Saludos.
__________________
Si todos escribiéramos sin faltas de ortografía, el mundo sería un lugar mejor.
  #4 (permalink)  
Antiguo 11/02/2013, 14:16
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: Duda patron singleton

Eso sería más como un registro, mejor puedes usar como tal un Registry si vas a ocuparlo...

Etiquetas: mysql, patron, php, resultados, select, singleton, sql
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 22:19.