2012-11-25 250 views
2

考慮下面的代碼,我一直認爲Lynda.com 創建一個這樣的數據庫類,我的問題是爲什麼不創建 一個數據庫的靜態方法,而不是存儲 實例變成靜態屬性?靜態方法vs靜態實例

<?php 
class Database { 

    private $conn; 
    private static $init; 

    public function __construct() { 
    $this->conn = new mysqli('localhost','root','root','mydb'); 
    } 

    public static function getInstance() { 
    self::$init = new self(); 
    return self::$init; 
    } 

} 

$db = Database::getInstance(); 

?> 
+2

無論如何,它們都不好,因爲它們會創建全局狀態和隱式依賴關係,所以不要這樣做。 – ChocoDeveloper

+2

該代碼缺少'getInstance'上的'static'說明符。這被稱爲[單例模式](http://stackoverflow.com/questions/4595964/who-needs-singletons)。 – DCoder

+0

你確定*這是你的老師怎麼說的嗎?我聞到重要的細節缺失。 – goat

回答

2

如果你想使用單你應該保護__construct()

class DB 
{ 
    private static $instance; 

    private function __construct($args) 
    { 
    // do some 
    } 

    public static function getInstance() 
    { 
    // get instance 
    } 
} 

$query = 'SELECT etc...'; 
$stmt = DB::getInstance()->prepare($query); 

我使用DB類這種模式。但是,如果你有超過1個連接,你不應該!使用單身。

0

只是爲了澄清,$db是一個數據庫對象,這是通過調用靜態方法getInstance()實例化。

爲什麼不創建完全數據庫中的靜態方法?

一個靜態方法是在一個類中定義的,但是它可以在不需要實例化類的情況下被調用。換句話說,靜態方法屬於類,因爲可以在不實例化對象的情況下調用它。

如果您認爲有必要,您可以將方法添加到Database類以與數據庫進行交互。

+0

當我的意思是完全靜態方法,爲什麼不創建一個靜態方法,而不是一個構造函數的數據庫連接。 –

1

我的猜測是你貼的代碼的用意是以下因素,因爲它看起來像它的用意是單身。我只更改了getInstance()方法。

class Database { 

    private $conn; 
    private static $init; 

    public function __construct() { 
    $this->conn = new mysqli('localhost','root','root','mydb'); 
    } 

    public static function getInstance() { 
    if (is_null(self::$init)) { 
     self::$init = new self(); 
    } 
    return self::$init; 
    } 

} 

$db = Database::getInstance(); 

我認爲這應該清除爲什麼使用靜態實例變量的困惑。

如果不是希望成爲一個單身,那麼你的問題:「爲什麼他們不只是使用一個靜態方法」應該有答案「就應該有」。