Implementa Singleton para comunicarte con la BBDD

Hola amig@s, ¿qué tal las vacaciones? Yo ya estoy aquí, ya me veis. Hoy comparto con vosotr@s una clase PHP que implementa el patrón de diseño de software singleton en la capa modelo de una aplicación web.

Diseño de bases de datos

Este patrón tiene como objetivo evitar la multiplicidad de instancias de una clase OO. Concretamente, el código siguiente es para que sólo haya una conexión a la BBDD en cualquier momento durante la ejecución del script. Espero que te sirva de ayuda.

Clase DB.php:

<?php

class DB
{
    /**
     * @var DB The reference to *DB* instance of this class
     */
    private static $instance;

    /**
     * @var mysqli handler
     */
    private $mysqli;

    /**
     * Returns the *DB* instance of this class.
     *
     * @return Singleton The *Singleton* instance
     */
    public static function getInstance()
    {
        if (null === static::$instance) {
            static::$instance = new static();
        }

        return static::$instance;
    }

    /**
     * Protected constructor to prevent creating a new instance of the
     * *DB* via the `new` operator from outside of this class.
     */
    protected function __construct()
    {
        $this->mysqli = new \MySQLI(DB_SERVER, DB_USER, DB_PASSWORD, DB_NAME);
        $this->mysqli->set_charset('utf8');
    }

    /**
     * Private clone method to prevent cloning of the instance of the
     * *DB* instance.
     */
    private function __clone()
    {
    }

    /**
     * Private unserialize method to prevent unserializing of the *DB*
     * instance.
     */
    private function __wakeup()
    {
    }

    /**
     * Returns the database handler.
     *
     * @return mysqli The database handler
     */
    public function handler()
    {
        return $this->mysqli;
    }

    /**
     * Runs a MySQL query.
     *
     * @param string The sql query
     *
     * @return false|mysqli_result The result of running the query
     */
    public function query($sql)
    {
        return $this->mysqli->query($sql);
    }

    /**
     * Escapes the data to prevent MySQL injections.
     *
     * @param string The string to be escaped
     *
     * @return string The escaped string
     */
    public function escape($data)
    {
        return $this->mysqli->real_escape_string($data);
    }
}

He sacado la plantilla Singleton de este documento publicado en PHP The Right Way, y la he personalizado creando la propiedad $mysqli y escribiendo el constructor de la clase DB:

    ...

    /**
     * Protected constructor to prevent creating a new instance of the
     * *DB* via the `new` operator from outside of this class.
     */
    protected function __construct()
    {
        $this->mysqli = new \MySQLI(DB_SERVER, DB_USER, DB_PASSWORD, DB_NAME);
        $this->mysqli->set_charset('utf8');
    }

    ...

Como ves, también he añadido estos métodos específicos a la clase DB:

    ...

    /**
     * Returns the database handler.
     *
     * @return mysqli The database handler
     */
    public function handler()
    {
        return $this->mysqli;
    }

    /**
     * Runs a MySQL query.
     *
     * @param string The sql query
     *
     * @return false|mysqli_result The result of running the query
     */
    public function query($sql)
    {
        return $this->mysqli->query($sql);
    }

    /**
     * Escapes the data to prevent MySQL injections.
     *
     * @param string The string to be escaped
     *
     * @return string The escaped string
     */
    public function escape($data)
    {
        return $this->mysqli->real_escape_string($data);
    }

    ...

También te puede interesar leer esto…