2011-11-29 19 views
1

我想知道如果創建一個類如下面的類將是一個很好的做法。用於連接,關閉,開放的MySQLi類模式?

所以我會在每次需要做一些工作時使用self :: $ mysqli對象,並且只會在__desctruct()上關閉連接。另外,由於$ mysqli被聲明爲靜態的,因此擴展類仍然只保持一個連接。

這樣我就只有一個連接以爲腳本

class db { 
protected static $mysqli; 

function __contruct(){ 
    $this->mysqli = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_DATABASE); 
    // DB_HOST, DB_USER, DB_PASS, DB_DATABASE defined elsewhere 
} 

function __destruct(){ 
    $this->mysqli->close(); 
} 
} 

我想知道你對這個見解。

回答

3

關閉它沒有壞處,我想知道,如果創建一個類像下面的人會是一個很好的做法。

我認爲這不是一個好習慣。特別是有一個原因:你描述了你認爲需要它的原因:每個請求只有一個連接。

你不需要編碼任何東西。 mysqli內置了一個很好的功能,默認連接。它採用主從INI設置數據庫連接參數(配置)每次創建新實例時間:

$db = new mysqli; 

當腳本完成所有數據庫連接關閉掉,沒有太多的關心都沒有。你需要做的唯一事情就是實例化連接一次,並將變量傳遞給需要該對象的所有代碼。

另一個不好的做法是,你引入SingletonDoc這裏,是這樣的:

class MysqliSingleton extends mysqli 
{ 
    private static $instance; 
    /** 
    * @return MysqliSingleton 
    */ 
    public function getInstance() 
    { 
     if (NULL === self::$instance) 
      self::$instance = new self(); 
     return self::$instance; 
    } 
    private function __construct() 
    { 
    } 
    public function __clone() 
    { 
     throw new RuntimeException('Clone is not allowed.'); 
    } 
    public function __wakeup() 
    { 
     throw new RuntimeException('Unserializing is not allowed.'); 
    } 
} 

它的工作是這樣的:

$mysqli = MysqliSingleton::getInstance(); 

,並會始終返回一個mysqli的實例,該實例可能是你在找什麼。然而單身人士被認爲是有害的,因爲他們可以引入很多問題,請參閱相關問題Who needs singletons?

讓您自己創建一個您傳遞的包含數據庫實例的變量會更容易。您還可以封裝某種惰性加載,以防您的應用程序不總需要mysqli連接,例如有一個很簡單的上下文類:

interface ContextMysqli 
{ 
    /** 
    * @return mysqli 
    */ 
    public function getMysqli(); 
} 

class Context implements ContextMysqli 
{ 
    private $mysqli; 
    public function getMysqli() 
    { 
     $this->mysqli || $this->mysqli = new mysqli(); 
     return $this->mysqli; 
    } 
} 

當你的腳本開始,只是實例化你的背景和它傳遞給你的代碼的每一個部分,你需要它:

$context = new Context(); 
... 
$result = do_some_db_work($context); 
... 
function do_some_db_work(ContextMysqli $context) 
{ 
    $mysqli = $context->getMysqli(); 
    ... 
} 

這個建議可能是有點目光短淺,但它比單身人士好,而不會引入太多東西。好處是你已經封裝了邏輯何時創建不需要單例的mysqli對象。您的代碼現在獨立於全局或靜態上下文。

3

當PHP完成執行時,它將自動關閉所有連接,因此不需要顯式關閉連接,除非優化一個相當大的系統或內存使用量必須保持在絕對最小值。

上面的設置只會保持連接打開狀態,您可以查看單例模式,但這對於此基本用例來說是嚴重矯枉過正的。

話雖這麼說,有在年底:)