Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/246.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何确保我没有在PHP类中重新创建多个DB连接?_Php_Class_Mysqli - Fatal编程技术网

如何确保我没有在PHP类中重新创建多个DB连接?

如何确保我没有在PHP类中重新创建多个DB连接?,php,class,mysqli,Php,Class,Mysqli,我在这方面还不是很在行,我已经试着弄清楚了,但似乎做不到 我正在尝试编写一个PHP类,该类重用其数据库连接,而不是在每次需要时都创建一个新的数据库连接。如何确保我没有每次都重新创建新连接 请考虑下面的代码,如果我在PHP文件中创建了几个连接或重用相同的代码,请告诉我。 谢谢 PHP文件 类文件 有几种方法可以做到这一点。通常,在创建“真实世界”的应用程序时,您将使用一个体面的框架,该框架将数据库连接和公共数据库功能作为依赖项/服务提供 但在您玩游戏时,对于一个简单的用例来说,以下是最常见的: A

我在这方面还不是很在行,我已经试着弄清楚了,但似乎做不到

我正在尝试编写一个PHP类,该类重用其数据库连接,而不是在每次需要时都创建一个新的数据库连接。如何确保我没有每次都重新创建新连接

请考虑下面的代码,如果我在PHP文件中创建了几个连接或重用相同的代码,请告诉我。 谢谢

PHP文件 类文件
有几种方法可以做到这一点。通常,在创建“真实世界”的应用程序时,您将使用一个体面的框架,该框架将数据库连接和公共数据库功能作为依赖项/服务提供

但在您玩游戏时,对于一个简单的用例来说,以下是最常见的:

A) 设计模式。(现在支持依赖注入不鼓励使用单例,但为了玩/学习,可以接受使用单例。)

B) 将DB连接分配给全局变量(即任何函数的上下文之外),并在需要时使用
global
关键字导入它。这看起来像这样:

$db=createMyConnection();
函数inedThedbConnection()
{
全球$db;
//下面是使用连接的代码
}

这实际上比singleton更糟糕,但它可以工作,并且仍然被广泛使用(例如在WordPress中)。

创建数据库处理程序的一个非常好的方法是使用一个返回自身的静态类方法。称为单例模式

class DB {

  /**
   * Points to the instance of this class.
   * @var object
   */
  private static $instance = null;

  /**
   * Points to the database connection
   * @var object
   */
  private $db;

  /**
   * Initiates a new instance of self if one isn't set and opens a db connection
   * @return object an object of self
   */
  public static function getInstance() {
    if(self::$instance == null) {
      self::$instance = new self;
      $this->db = new PDO();
    }
    return self::$instance;
  }

  /**
   * Runs a query on the database
   * @param  string $query the query to run on the db
   * @return array         the result set
   */
  public function query($query) {
    // Query..
    $stmt = $this->db->prepare("SELECT * FROM table");
    $stmt->execute();
    return $stmt->fetchAll();
  }
}
简单的用法是:

$result = DB::getInstance()->query("SELECT * FROM table");
var_dump($result); // Outputs array of results.
这将在您第一次调用DB::getInstance()时只打开一个连接。这样,您就不必启动该类,它支持链接。Laravel框架也使用了这种方法

有多种方法可以实现这一点,正如lxg所述,singleton方法是实现这一点的一种方法,但是您也可以为类分配在脚本运行时开始时打开的连接

class NeedDB {

  /**
   * Points to the DB connection
   * @var object
   */
  private $db;

  /**
   * Class constructor
   * @param object $db The DB connection object
   */
  public function __construct($db) {
    $this->db = $db;
  }

  /**
   * Runs a query on the database
   * @param  string $query the query
   * @return array         the result set
   */
  public function query($query) {
    $stmt = $this->db->prepare($query);
    $stmt->execute();
    return $stmt->fetchAll();
  }
}

$db = new PDO();
$class = new NeedDB($db);

$result = $class->query("SELECT * FROM table");
var_dump($result);

mysql将回收一个连接,如果它已经存在并具有相同的凭据那么,等等,这是否意味着我不需要为上面的所有内容操心?我想他说的是,如果你经历所有这些,创建一个新的db对象,如果它具有相同的凭据,它将只使用内存中已经存在的旧对象,所以它不会成为一个新的。我理解,谢谢你,汉克斯!我喜欢最后一种方法。
$result = DB::getInstance()->query("SELECT * FROM table");
var_dump($result); // Outputs array of results.
class NeedDB {

  /**
   * Points to the DB connection
   * @var object
   */
  private $db;

  /**
   * Class constructor
   * @param object $db The DB connection object
   */
  public function __construct($db) {
    $this->db = $db;
  }

  /**
   * Runs a query on the database
   * @param  string $query the query
   * @return array         the result set
   */
  public function query($query) {
    $stmt = $this->db->prepare($query);
    $stmt->execute();
    return $stmt->fetchAll();
  }
}

$db = new PDO();
$class = new NeedDB($db);

$result = $class->query("SELECT * FROM table");
var_dump($result);