2012-03-02 66 views
0

你好我正在使用php,我试图做一个数据库类,其中构造函数将类连接到数据库并将指针指派给类变量。我遇到的问题是,每次创建类的新实例时,都会调用构造函数,并将代码连接到数据库。我不明白为什么每次调用数据库时都要连接数据库,所以我怎么去做一个类变量,它在所有的实例中都是一样的,一旦它被赋予了指针,它就不会创建它再次。php创建一个类变量

感谢

+1

您可能需要阅读这个问题和接受的答案:http://stackoverflow.com/questions/9227400/php-singleton-database-connection-is-这个代码坏习惯 – summea 2012-03-02 21:51:07

+0

我同意summea,我个人觉得依赖注入方式比单例更容易实现。 – Kisaro 2012-03-02 21:57:35

回答

2

数据库连接不应该在构造函数中去。您应该有一个ConnectionFactory类,它将连接数据库并返回一个新的DatabaseConnection对象。

<?php 

class ConnectionFactory { 
    public static function newConnection($credentials) { 
     //Connect to database 
     $connection = new PDO(/* Credentials */); 
     return $connection; 
    } 
} 

$connection = ConnectionFactory::newConnection(CREDENTIALS); 
1

嗨,你有两个选择。

最好的办法是创建一个singleton class。这是一个引用它自己的类,所以你永远不能创建它多于一个。如果您尝试创建多个它,它将返回其本身的当前初始版本。

否则坚持你拥有的东西,只要确保你没有每次都打电话给new

例如

$db = new Database(); // call this once to create 
// don't do this again 
$anotherdb = new Database(); 
// just use the db object from before 
$db->query("..."); 

但是这可能会比较混乱,而且你可能会失去变量的范围,所以我建议用单方法去。有些人会告诉你不要使用单身人士,而是由你决定。适用于数据库类。

如果你在互联网上浏览,你会发现其他数据库类的例子来看看。

看看像codeigniter这样的框架,他们也使用自己的数据库类。可能值得看看他们是如何工作的。

+1

单身是邪恶的。如果他确实需要连接多次(到不同的数据库,具有不同的凭证)? – 2012-03-03 11:01:48

+0

我听说单身人士是邪恶的,但我从来没有遇到任何问题。在iOS编程之后(目标c),我发现单例是非常有用的。您可以使用多个连接创建单身人士。创建一个静态变量来保存每个连接。无论如何,它是帮助OP的答案。 – 2012-03-03 18:21:59

0

您应该创建一个单独的连接,并在类之间共享,而不是为每个创建的类创建新的连接。

$connection = new PDO(...); 

$first = new Foo($connection); 
$second = new Bar($connection); 

这样,两个实例都可以访问相同的连接。

您也可以观看这部视频中获益:The Clean Code Talks - Don't Look For Things!