Foro de elhacker.net

Programación => Desarrollo Web => Mensaje iniciado por: flash-back en 11 Febrero 2013, 16:37 pm



Título: Duda patrón Singleton
Publicado por: flash-back en 11 Febrero 2013, 16:37 pm
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/crear-una-clase-para-conectar-a-base-de-datos-con-php-c63332l/ (http://www.cristalab.com/tutoriales/crear-una-clase-para-conectar-a-base-de-datos-con-php-c63332l/)
Código:
/* 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.