如何从扩展类关闭连接

如何从扩展类关闭连接

问题描述:

I have a singleton database connection class- db.php (found by googling):

<?php
/*
* Mysql database class - only one connection alowed
*/
class db {
    private $_connection;
    private static $_instance; //The single instance
    private $_host = "localhost";
    private $_username = "user_name";
    private $_password = "password";
    private $_database = "database";

    /*
    Get an instance of the Database
    @return Instance
    */
    public static function getInstance() {
        if(!self::$_instance) { // If no instance then make one
            self::$_instance = new self();
        }
        return self::$_instance;
    }

    // Constructor
    private function __construct() {
        $this->_connection = new mysqli($this->_host, $this->_username,
            $this->_password, $this->_database);

        // Error handling
        if(mysqli_connect_error()) {
            trigger_error("Failed to conencto to MySQL: " . mysql_connect_error(),
                 E_USER_ERROR);
        }

    // Magic method clone is empty to prevent duplication of connection
    private function __clone() { }

    // Get mysqli connection
    public function getConnection() {
        return $this->_connection;
    }

    public function closeConnection(){
      $this->_connection->close();
    }
}
?>

To test the connectivity, If I extend that database class in ext.php like this:

<?php
class ext extends db {
private $conn;
function __construct(){
 $this->connect();
 if(isset($this->conn)){
       echo 'Connection is established<br />';
  }
 $this->closeConn();
}
public function connect(){ 
    $this->conn = parent::getInstance()->getConnection();
}
public function closeConn(){
     parent::closeConnection();
}
}
?>

and in my index.php page:

<?php
spl_autoload_register(function ($class) {
    include '../classes/' . $class . '.php';
});
$test = new ext();
?>

now my output is as below:

Connection is established 
Fatal error: Call to a member function close() on a non-object in (line number) of db.php

my question is how can I close connection in extended class (ext.php)?

The solution would be like this:

  • First, create a private instance variable of parent class db in ext class, like this:

    class ext extends db {
        ...
        private $parentInstance;
        ...
    }
    
  • Then use this instance variable $parentInstance to create and close your connection, like this:

    class ext extends db {
        private $conn;
        private $parentInstance;
        function __construct(){
            $this->connect();
            if(isset($this->conn)){
                echo 'Connection is established<br />';
            }
            $this->closeConn();
        }
        public function connect(){ 
            $this->parentInstance = parent::getInstance();
            $this->conn = $this->parentInstance->getConnection();
        }
        public function closeConn(){
             $this->parentInstance->closeConnection();
        }
    }
    

Sidenote: There's one small syntax error in db class as well. The closing parentheses of constructor method is missing.