2011-11-01 59 views
2
class SingleTon 
{ 
    private static $instance; 

    private function __construct() 
    { 
    } 

    public function getInstance() { 
     if($instance === null) { 
      $instance = new SingleTon(); 
     } 
     return $instance; 
    } 
} 

上面的代碼描述了本文中的單例模式。 http://www.hiteshagrawal.com/php/singleton-class-in-php-5PHP中的單例模式

我不明白一件事。我在我的項目中加載這個類,但是我最初如何創建一個Singleton對象。我會這樣打電話嗎Singelton :: getInstance()

任何人都可以告訴我一個單身人士班的數據庫連接建立?

+1

什麼'如果($實例=== NULL){$ 例如=新辛格爾頓()的一部分; }'你不清楚嗎? (注意:它是Singleton,不是SingleTon,Singelon或Singelton) – Piskvor

回答

10

的你將如何實現一個數據庫類Singleton模式的例子可以看到下面:

class Database implements Singleton { 
    private static $instance; 
    private $pdo; 

    private function __construct() { 
     $this->pdo = new PDO(
      "mysql:host=localhost;dbname=database", 
      "user", 
      "password" 
     ); 
    } 

    public static function getInstance() { 
     if(self::$instance === null) { 
      self::$instance = new Database(); 
     } 
     return self::$instance->pdo; 
    } 
} 

您能夠利用這些類的方式如下:

$db = Database::getInstance(); 
// $db is now an instance of PDO 
$db->prepare("SELECT ..."); 

// ... 

$db = Database::getInstance(); 
// $db is the same instance as before 

而且作爲參考,Singleton接口將如下所示:

interface Singleton { 
    public static function getInstance(); 
} 
+0

什麼是我的父單例構造函數看起來像parent :: __構造(「mysql:host = localhost; dbname = database」,「user」,「password」); – theJava

+0

@theJava:在這個例子中,我擴展了PDO類,所以PDO的['__construct()'](http://php.net/manual/pdo.construct.php)就是這個方法。 –

+0

所以這裏Singleton是一個接口,而不是一個類......爲什麼我會這樣做...... – theJava

1

是的,你必須使用

SingleTon::getInstance(); 

第一次將上試私人VAR $instance是零,因此將運行該腳本$instance = new SingleTon();打電話。

對於數據庫類來說,它是一樣的。這是我在Zend Framework中使用類的摘錄:

class Application_Model_Database 
{ 
    /** 
    * 
    * @var Zend_Db_Adapter_Abstract 
    */ 
    private static $Db = NULL; 

    /** 
    * 
    * @return Zend_Db_Adapter_Abstract 
    */ 
    public static function getDb() 
    { 
     if (self::$Db === NULL) 
     self::$Db = Zend_Db_Table::getDefaultAdapter(); 
     return self::$Db; 
    } 
} 

注意:該模式是單身,沒有辛格爾頓。

0

對您的代碼的一些更正。你需要確保getInstance方法是'靜態的',這意味着它是一個類方法而不是一個實例方法。您還需要通過'self'關鍵字來引用該屬性。

儘管通常不會完成,但您還應該重寫「__clone()」方法,該方法會短路克隆實例。

<? 
class Singleton 
{ 
    private static $_instance; 

    private function __construct() { } 
    private final function __clone() { } 

    public static function getInstance() { 
     if(self::$_instance === null) { 
      self::$_instance = new Singleton(); 
     } 
     return self::$_instance; 
    } 
} 
?> 

$mySingleton = Singleton::getInstance(); 

有一點不是如果你打算做單元測試,使用單例模式會給你帶來一些困難。見http://sebastian-bergmann.de/archives/882-Testing-Code-That-Uses-Singletons.html

0
class Database{ 
    private static $link=NULL; 
    private static $getInitial=NULL; 

    public static function getInitial() { 
     if (self::$getInitial == null) 
     self::$getInitial = new Database(); 
     return self::$getInitial; 
    } 
    public function __construct($server = 'localhost', $username = 'root', $password ='tabsquare123', $database = 'cloud_storage') { 

     self::$link = mysql_connect($server, $username, $password); 
     mysql_select_db($database,self::$link); 
     mysql_query("SET CHARACTER SET utf8", self::$link); 
     mysql_query("SET NAMES 'utf8'", self::$link); 
     return self::$link; 
    } 

    function __destruct(){ 
      mysql_close(self::$link); 
    } 
} 
+0

你可以嘗試發表一些你寫的代碼的解釋嗎? – NREZ