Если я использую статический метод в PHP для создания соединения с базой данных, я получаю одно или несколько соединений?

Я ищу создание объекта, который призван передать данные в хранилище данных. В моей реализации используется MySQLi, но я хочу разрешить другим разработчикам использовать любое хранилище данных, которое они хотят.

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

<?php
    class RECORDS {

        protected $conn;

        public function __construct() {
            //contect to DB
            $conn = $this::connection();
        }

        public static function &connection(){
            $conn = NULL;
            if($conn==NULL){
                $conn = new mysqli(_DB_HOST_, _DB_USER_, _DB_PASS_, _DB_HOST_);
                if ($mysqli->connect_errno) {
                    die("Failed to connect to MySQL: (" .
                         $mysqli->connect_errno . ") " .
                         $mysqli->connect_error);
                }
            }
            return $conn;
        }
        // ... methods that do stuff
    }

Имею ли я правильную идею о статических методах и буду ли я повторно использовать одно и то же соединение или создавать новые?

Ответ 1

Ваше поле protected $conn не является статическим полем, поэтому оно не доступно из статического метода (см. http://php.net/manual/en/language.oop5.static.php).

Вы также можете использовать self::$conn для доступа к статическому полю или $this->conn для доступа к полям объектов. Как вы это делаете, вы используете локальную переменную, которая делает ваш protected $conn неиспользованным. Я полагаю, что ваш код должен выглядеть так:

<?php
    class RECORDS {

        protected static $conn = null;

        public function __construct() {

            //Connect to database
            self::$conn = $this::connection();
        }

        public static function &connection(){

            if(self::$conn==NULL){
                self::$conn = new mysqli(_DB_HOST_, _DB_USER_, _DB_PASS_, _DB_HOST_);
                if ($mysqli->connect_errno) {
                    die("Failed to connect to MySQL: (" .
                         $mysqli->connect_errno . ") " .
                         $mysqli->connect_error);
                }
            }
            return self::$conn;
        }
        // ... methods that do stuff
    }