2017-01-01 60 views
0

我刚刚开始使用oop,现在,即使非常简单的事情也让我感到困惑! 这是我的mysqli连接类:避免与db类的多个mysqli连接

class DB{ 
    private $con; 
    public function __construct(){ 
     $this->con=new mysqli('localhost','root','','dbName'); 
     if(!$this->con){ 
      echo '<b>There was a problem connecting to database! </b><br />errno: '.$con->connect_errno; 
      exit; 
     } 
     $this->con->set_charset("utf8"); 
    } 
    public function query($query){ 
     return $this->con->query($query); 
    } 
} 

比方说我要去使用,像这样:

$a=mysqli_real_escape_string($_POST['a']); 
$b=mysqli_real_escape_string($_POST['b']); 

$query='SELECT `name` FROM `someTable` WHERE `type`={'.$a.'}'; 
$query2='SELECT `name` FROM `someTable` WHERE `type`={'.$b.'}'; 

$DB = NEW DB; 
$test=$DB->query($query); 

$DB2 = NEW DB; 
$test2=$DB2->query($query2); 

我刚刚创建的类DB 2个对象。 是否意味着每个对象都有一个新的mysql连接?如果是的话,我该如何避免它?

我知道我可以在__destruct()函数中使用mysqli_close(),但我在某处阅读(可能在这个网站:))创建和销毁几个mysql连接并不好。

我该怎么办? p.s:旁边,就像我说的我是新来的oop(和mysqli一样),所以如果有关于我的课程的任何评论(例如我是否将字符集放在正确的地方?)我会很荣幸。

回答

1

当您创建一个类的实例时,如果它正常工作,则不需要重新创建它。

例1

在你的问题

你这样做:

$DB = new DB(); 
$test=$DB->query($query); 

$DB2 = new DB(); 
$test2=$DB2->query($query2); 

你可以这样做,而不是:

$DB = new DB(); 
$test = $DB->query($query); 
$test2 = $DB->query($query2); 

例2

一些次你有一个实例,你想在任何地方使用它。您可以在代码的开始处或首次请求时创建它。然后你可以在任何地方使用它。

$DB = new DB(); 

function something(){ 

    global $DB; 

    $test = $DB->query($query); 
} 

如果你的课是简单的,就像你在这里提到的那样,就像第一个例子那样使用它。此方法适用于需要随处访问的实例。一个功能会改变其中的某个功能,另一个功能会改变它。

此外,这种方法被认为是不好的做法,因为它会让你的代码难以阅读和调试。

一些有用的链接:

+1

- 请使用....'''global'''变量在OOP标签....今天是2017年!? – pomaxa

+0

@pomaxa你是对的。对一个实例使用全局变量不是很好的做法。但是这是一个例子,说明如果您真的想在创建之前使用它创建的实例。 – ICE

+1

- 我只是留下类似问题的链接:http://stackoverflow.com/a/219599/164803 – pomaxa