如何关闭扩展类

时间:2016-12-24 16:59:22

标签: php database oop mysqli

我有一个单例数据库连接类-db.php(通过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();
    }
}
?>

要测试连接性,如果我在ext.php中扩展该数据库类,如下所示:

<?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();
}
}
?>

并在我的index.php页面中:

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

现在我的输出如下:

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

我的问题是如何在扩展类(ext.php)中关闭连接?

1 个答案:

答案 0 :(得分:1)

解决方案是这样的:

  • 首先,在private类中创建父类db的{​​{1}}实例变量,如下所示:

    ext
  • 然后使用此实例变量class ext extends db { ... private $parentInstance; ... } 创建并关闭您的连接,如下所示:

    $parentInstance

Sidenote 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(); } } 类中也存在一个小的语法错误。缺少构造函数方法的右括号。