user1180807 user1180807 - 10 months ago 70
PHP Question

Creating a globally accessible MySQLi object

I have multiple classes that use static methods. These functions connect to the database using

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

where the constants DB_SERVER, DB_USER, DB_PASS, DB_NAME are database variables defined in a globally accessible file. Recently, my site started becoming slow and after profiling the script I realized that the call to create the object($mysqli) was causing this problem.

Most of my classes extend from mysqli such that

public function __construct($user_id) {
parent::__construct(DB_SERVER, DB_USER, DB_PASS, DB_NAME);


It is to my understanding that static methods DO NOT use the __construct method.

Could someone guide me on how I can create the $mysqli object once such that it can be accessed by all static methods that require it.

Answer Source

Here is one approach:

Create a singleton class, that can be accessed statically from anywhere.

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 ;

An example would be:

$mysqli = DBConnector::getInstance() ;

Hovewer I suggest using another solution as well:

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

Then you could pass that object to other classes (constructor)

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

$show = new Shop($mysqli) ;