Создание глобального объекта 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');
}
});