2017-01-01 99 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