У меня есть несколько классов, которые используют статические методы . Эти функции подключаются к базе данных, используя
$mysqli = new mysqli(DB_SERVER, DB_USER, DB_PASS, DB_NAME);
где константы DB_SERVER, DB_USER, DB_PASS, DB_NAME являются переменными базы данных, определенными в глобально доступном файле. В последнее время мой сайт начал медленно, и после профилирования скрипта я понял, что вызов создания объекта ($ 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 один раз, чтобы к нему можно было получить доступ ко всем статическим методам, которые его требуют.
Вот один из подходов:
Создайте одноэлементный класс, доступ к которому можно получить статически из любого места.
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) ;
Чтобы продумать одноэлемент 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(); } }
Это самая короткая версия, которую я мог бы придумать для Bootstrap 3.
$(document).ready(function() { if (hash = window.location.hash) { $('.nav-tabs a[href="' + hash + '"]').tab('show'); } });