php mysql:如何避免类中数据库的多个连接?

时间:2014-03-14 09:53:12

标签: php pdo

这是我的index.php

<?
require("Annonce.php");
$annonce = new Annonce();
$annonce->id=1;
$annonce->delete();

?>

我的Annonce.php是!

<?php 

require("DB.php");
class Annonce extends DB {
}    
 ?>

最后DB是:

<?php 
$db = new PDO('mysql:host=localhost;dbname=annonces;charset=utf8', 'root', '');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);


class DB {
    public static $debug = true;    
    function __construct() {
        # code...
    }
    function delete() {
        $id = $this->id;
        $table = get_class($this);
        $sql="delete from $table where id=$id";     
        if ($this::$debug) echo $sql;

    }

    function get() {
        $sql="select *...";
    }

}
 ?>

我不知道定义$ db连接的最佳策略是什么?

如果我在DB类中定义它,它将在创建“Annonce”对象时建立连接。也许使用$ db作为GLOBAL(我认为不干净)

对此有何建议?

2 个答案:

答案 0 :(得分:1)

创建一个Singleton,有点像这样:

class DB
{
   private $_db;
   private $_instance;
   private function __construct() 
   {

    $this->_db = $db = new PDO('mysql:host=localhost;dbname=annonces;charset=utf8', 'root', '');

}

public static function getInstance()
{
    if(!(self::$_instance instanceof DataBase)){
      $c = __CLASS__;
      self::$_instance = new $c;
    }
    return self::$_instance;
}
//.....other code

}

使用它:

$db = DB::getInstance();

答案 1 :(得分:0)

您可以将连接定义为服务,并使用依赖性伤害容器(DIC)通过提供依赖性注入容器为任何其他需要它的功能/模块/类提供连接。疙瘩是“为我们带来Symfony的人们的simple DIC Solution”。

无论如何,拥有DIC是一个好主意。

对于你的问题,这可能看起来“超过顶部”(因为Singleton会完全解决你的问题),但考虑到DIC会更多地改善你的工作。你要求一个干净的解决方案。如果您不使用单元测试,单身人士设计模式将是干净的,因为单身人士将get you into trouble with mocking

Read more about it here