PHP OOP关闭这样的连接是一个好习惯

时间:2014-06-20 19:54:46

标签: php oop connection

这是我的数据库类

class DataBase{
  public $_localhost  = "localhost";// server name => usually is localhost
  public $_user       = "root"; // username for the database
  public $_password   = "123"; // password for the database
  public $_dbname     = "ecommerce"; // database name
  public $db          = false;

  public  function __construct(){
    try{
      $this->db = new PDO("mysql:host=".$this->_localhost.";dbname=".$this->_dbname,$this->_user,$this->_password);
      $this->db->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
      $this->db->exec("SET NAMES utf8");
      return $this->db;
    }catch(PDOException $e){
      echo $e->getMessage();
    }
  }

  public function __destruct(){
    $this->db = null;
  }
}

现在在我的应用程序类

class Application{
  public $db;

  public function __construct(){
    $this->db =  new DataBase();
    $this->db = $this->db->db;
  }
}

因为我想用我的破坏功能关闭我的连接

这是一个很好的方法吗?

1 个答案:

答案 0 :(得分:3)

您不需要在典型的PHP流程中关闭数据库连接。一旦返回响应并且无法访问对象的所有引用,PHP运行时将自行完成。

在许多网络环境中,无论如何都需要持久连接,因为每次请求发送到您的网站时,它们都会减少打开和关闭连接的开销。

查看PDO::ATTR_PRESISTENT(Example 4)的文档

但是,如果您知道连接将在几分钟内闲置,则可能需要在长时间运行的非Web 过程中自行关闭数据库连接。

在这种情况下将PDO对象设置为null,以通知PHP该特定连接可能已关闭。

析构函数是错误的。向您的类添加一个不依赖于PHP Runtime调用的自定义close方法。

顺便说一下:

在Application实例和数据库连接(-wrapper)之间创建一个无关紧要的硬耦合被认为是不好的做法。我建议你改变你的应用程序类,以允许构造函数注入你的数据库实例。这可能真的可以帮助您稍后测试/模拟您的代码并提高可重用性。

如果您想了解更多关于php中的一般概念和实现示例,请参阅此series of blog entries by Fabien Potencier