这是我的数据库类
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;
}
}
因为我想用我的破坏功能关闭我的连接
这是一个很好的方法吗?
答案 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