Создание глобального объекта MySQLi

У меня есть несколько классов, которые используют статические методы. Эти функции подключаются к базе данных с помощью

$mysqli = new mysqli(DB_SERVER, DB_USER, DB_PASS, DB_NAME);

где константы DB_SERVER, DB_USER, DB_PASS, DB_NAME являются переменными базы данных, определенными в глобально доступном файле. Недавно мой сайт начал медленно, и после профилирования script я понял, что вызов создания объекта ($ mysqli) вызывал эту проблему.

Большинство моих классов расширяются от mysqli, так что

public function __construct($user_id) {
    parent::__construct(DB_SERVER, DB_USER, DB_PASS, DB_NAME);
    $this->retrieve_user_details($user_id);
    $this->check_user_account_type();

}

По моему мнению, статические методы НЕ НЕ используют метод __construct.

Может ли кто-нибудь направить меня на то, как я могу создать объект $mysqli один раз, чтобы он мог получить доступ ко всем статическим методам, которые его требуют.

Ответ 1

Вот один из подходов:

Создайте одноэлементный класс, доступ к которому можно получить статически из любого места.

class DBConnector {
    private static $instance ;
    public function __construct($host, $user, $password, $db){
      if (self::$instance){
        exit("Instance on DBConnection already exists.") ;
      }
    }

    public static function getInstance(){
      if (!self::$instance){
        self::$instance = new DBConnector(a,b,c,d) ;
      }
      return $instance ;
    }
}

Пример:

$mysqli = DBConnector::getInstance() ;

Hovewer Я предлагаю использовать другое решение:

$mysqli = new MySQLi(a,b,c,d) ;

Затем вы можете передать этот объект другим классам (конструктор)

class Shop {
  private $mysqli ;
  public function __construct(MySQLi $mysqli){
    $this->mysqli = $mysqli ;
  }
}

$show = new Shop($mysqli) ;

Ответ 2

Чтобы проработать синтаксис mysqli:

define('SERVER', 'localhost');
define('USERNAME', 'root');
define('PASSWORD', 'password');
define('DATABASE', 'databaseName');

class mysqliSingleton
{
    private static $instance;
    private $connection;

    private function __construct()
    {
        $this->connection = new mysqli(SERVER,USERNAME,PASSWORD,DATABASE);
    }

    public static function init()
    {
        if(is_null(self::$instance))
        {
            self::$instance = new mysqliSingleton();
        }

        return self::$instance;
    }


    public function __call($name, $args)
    {
        if(method_exists($this->connection, $name))
        {
             return call_user_func_array(array($this->connection, $name), $args);
        } else {
             trigger_error('Unknown Method ' . $name . '()', E_USER_WARNING);
             return false;
        }
    }
}

Затем вы можете запросить соединение с базой данных, вызвав:

$db = mysqliSingleton::init();

Затем вы можете восстановить соединение с базой данных в своих собственных объектах:

class yourClass
{
    protected $db;

    public function __construct()
    {
        $this->db = mysqliSingleton::init();
    }
}

Ответ 3

Это самая короткая версия, которую я мог бы придумать для Bootstrap 3.

   $(document).ready(function() {
        if (hash = window.location.hash) {
            $('.nav-tabs a[href="' + hash + '"]').tab('show');
        }
    });