如果我在PHP中使用静态方法来创建与数据库的连接,我最终会得到一个或多个连接


If I use a static method in PHP to create a connection to a database will I end up with one or many connections?

我正在考虑创建一个被调用以将数据传递到数据存储的对象。我的实现使用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
    }

我对静态方法有正确的想法吗?我会重用相同的连接还是创建新的连接?

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
    }