2014-03-14 44 views
1

这里是我的index.phpphp mysql:如何避免在一个类中的多个数据库连接?

<? 
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(我认为它不干净)

对此有何建议?

+0

也许你会对[Singleton pattern]感兴趣(http://php.net/manual/de/language.oop5.patterns.php)。 – Debflav

+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(); 
0

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

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

对于您的问题,这可能看起来是“顶级”(,因为辛格尔顿可以明确地解决您的问题),但考虑到DIC会使您的工作得到更多改进。你问了一个干净的解决方案。 Singleton设计模式只有在你不使用单元测试时才是干净的,因为Singletons将会是get you into trouble with mocking

Read more about it here

相关问题