【问题标题】:Where can I close the mysql connection in this class hierarchy?我在哪里可以关闭此类层次结构中的 mysql 连接?
【发布时间】:2011-07-23 21:36:44
【问题描述】:

我有 4 个 PHP 类用于注册用户,问题是我不知道如何关闭 mysql 连接。

类调用:

single_connect->数据库->post->注册

当我在单例中实现 mysql_close() 时,它会破坏我的代码。我的假设是,只要创建了一个注册对象,它所扩展的类也是“实例化的”。但情况似乎并非如此。

我必须注释掉 mysql_close 才能让它工作。请注意,我的单例使用数据库链接来确定它是否存在,然后像大多数单例一样使用指向自身的指针。

/*single_connect*/

class single_connect
  {
  private static $_db_pointer = NULL;
  private function __destruct() 
    {
    //mysql_close();
    }
  private function __construct()
    {
    self::$_db_pointer = mysql_connect(DB_HOST, DB_USER, DB_PASS);
    mysql_select_db(DB_DATABASE);
    }
  public static function get_connection()
    {
    if(self::$_db_pointer == NULL)
      {
      return new self();
      } 
    }
  }

/*database*/

abstract class database
  {
  protected function __construct()
    {
    single_connect::get_connection();
    }
  protected static function query($query)
    {
    $result = mysql_query($query) or die(mysql_error());
    return $result;
    }
  }

/*post*/

class post extends database
  {
  public $_protected_arr=array();
  protected function __construct()
    {
    parent::__construct();
    $this->protect();
    }
  protected function protect()
    {
    foreach($_POST as $key => $value)
      {
      $this->_protected_arr[$key] = mysql_real_escape_string($value);
      }
    }
  }

/*signup*/

class signup extends post 
  { 
 ...

【问题讨论】:

  • 你为什么要关闭连接?
  • 如果你不再需要它,你通常会关闭 mysql 连接。你的场景什么时候会出现这种情况?
  • 不,通常不会关闭 PHP 中的连接,因为它不需要,因为请求很快就会完成,正如已经说过的那样。
  • 不错的 OOP 编程,我不同意您不应该关闭连接。如果您使用的是持久连接,则无需关闭它。但否则自己关闭它,IMO,好习惯。
  • @Alan:这是一个可怕的想法,除非它自动重新打开。您永远无法确定查询将从何处发出或由哪个对象发出,因此您不应该在脚本完成之前关闭连接。由于这是自动处理的,因此没有理由手动进行。现在释放你经常需要做的语句和结果集,但这完全不同。

标签: php mysql class hierarchy


【解决方案1】:

脚本执行完成后连接会自动关闭。因此,如果在最后一次数据库操作和脚本结束之间没有大量时间,我就不会费心显式关闭连接。

【讨论】:

    【解决方案2】:

    我发现了问题。在我对单例类和静态属性的解释中,我检查了 PHP 如何处理静态属性。

    “与任何其他 PHP 静态变量一样,静态属性只能使用文字或常量进行初始化;不允许使用表达式。因此,虽然您可以将静态属性初始化为整数或数组(例如),但您不能初始化它传递给另一个变量、函数返回值或对象。” http://php.net/manual/en/language.oop5.static.php

    您不能像在 C++、Java 或大多数其他 OOP 语言中那样将静态属性设置为对象。在这种情况下,当类被 GC 时,连接被关闭。

    向 prodigitalson 道歉,我的 cmets 不正确。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-08
      • 1970-01-01
      • 2011-05-22
      • 1970-01-01
      • 1970-01-01
      • 2014-10-22
      • 2016-10-27
      相关资源
      最近更新 更多