【问题标题】:PHP OOP Is it a good practice to close connection like thisPHP OOP 像这样关闭连接是一个好习惯吗
【发布时间】:2014-08-11 15:35:37
【问题描述】:

这是我的数据库类

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;
  }
}

因为我想使用我的 destruct 函数来关闭我的连接

这是一个好方法吗?

【问题讨论】:

  • 问题是:为什么?
  • 旁注:在析构函数中将实例变量设置为null 是无操作的。
  • 我会说不,主要是因为destructor is not always called
  • 您不应为您创建的每个实例创建新的数据库连接。传递连接对象。 (关键字:依赖注入)。反正。您的代码并没有真正增加任何价值。在发送请求后,PHP 将自行处理连接。如果您有一个长时间运行的进程或使用一些疯狂的数据库驱动程序(这里不是这种情况),则通常需要手动关闭连接。
  • @watcher 好吧,这不是问题,因为数据库连接总是在关闭时被破坏。并且只要脚本处于正常的运行时阶段并且只要没有保留周期,析构函数的行为就是确定性的......

标签: php oop connection


【解决方案1】:

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

在许多网络情况下,您无论如何都需要持久连接,因为它们可以减少每次向您的站点发送请求时打开和关闭连接的开销。

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

但是,如果您知道数据库连接将闲置几分钟,您可能希望自己在长时间运行的非网络进程中关闭数据库连接。

在这种情况下将 PDO 对象设置为 null 以向 PHP 发出此特定连接可能已关闭的信号。

析构函数是错误的地方。向您的类添加一个不依赖于 PHP 运行时调用的自定义关闭方法。

顺便说一句:

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

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

【讨论】:

  • 谢谢,但是你能给我一个关于改变我的应用程序类以允许你的数据库实例的构造函数注入的例子吗?
  • 我添加了一个博客条目的链接。您可以简化其中的一些示例以满足您的需要,并参考其中的链接以获取更一般的概念。 (文末有些链接的资料真的很不错,虽然是关于java的)
  • 感谢这位朋友 :)
猜你喜欢
  • 2020-08-25
  • 1970-01-01
  • 2013-06-07
  • 2014-07-21
  • 1970-01-01
  • 1970-01-01
  • 2021-03-15
  • 2015-08-03
  • 1970-01-01
相关资源
最近更新 更多