在php中的单身人士模式

时间:2011-11-01 14:41:01

标签: php singleton

class SingleTon
{
    private static $instance;

    private function __construct()
    {
    }

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

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

我不明白一件事。我在我的项目中加载了这个类,但是我最初如何创建一个Singleton对象。我会这样打电话Singelton :: getInstance()

有人能告诉我一个建立数据库连接的Singleton类吗?

4 个答案:

答案 0 :(得分:11)

如何为数据库类实现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();
}

答案 1 :(得分:1)

是的,你必须使用

打电话
SingleTon::getInstance();

第一次测试私有var $instance为null,因此脚本将运行$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;
   }
}

注意:模式是Singleton,而不是SingleTon。

答案 2 :(得分:0)

对您的代码进行一些更正。您需要确保getInstance方法是'static',这意味着它是一个类方法而不是实例方法。您还需要通过'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

答案 3 :(得分: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);
    }
}