php中的单例模式

php中的单例模式,php,singleton,Php,Singleton,上面的代码描述了本文中的单例模式 我不明白一件事。我在我的项目中加载了这个类,但是我最初如何创建Singleton对象呢。我会像这样调用Singelton::getInstance() 有人能告诉我一个建立数据库连接的单例类吗?下面是一个如何为数据库类实现单例模式的示例: class SingleTon { private static $instance; private function __construct() { } public funct

上面的代码描述了本文中的单例模式

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


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

下面是一个如何为数据库类实现单例模式的示例:

class SingleTon
{
    private static $instance;

    private function __construct()
    {
    }

    public function getInstance() {
        if($instance === null) {
            $instance = new SingleTon();
        }
        return $instance;
    }
}
您可以以下列方式使用该类:

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;
    }
}
作为参考,
Singleton
界面如下所示:

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

// ...

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

是的,你必须打电话

interface Singleton {
    public static function getInstance();
}
第一次它将测试私有变量
$instance
,该变量为空,因此脚本将运行
$instance=new SingleTon()

对于数据库类,这是相同的。这是我在Zend Framework中使用的一个类的摘录:

SingleTon::getInstance();

注意:模式是单例模式,而不是单例模式。

对代码进行一些更正。您需要确保getInstance方法是“静态”的,这意味着它是类方法而不是实例方法。您还需要通过“self”关键字引用属性

虽然通常不会这样做,但您还应该重写“\uu clone()”方法,该方法会缩短实例的克隆

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;
   }
}

$mySingleton=Singleton::getInstance();

要避免的一件事是,如果您计划进行单元测试,那么使用单例模式将给您带来一些困难。如果($instance==null){$instance=new SingleTon();}

您不清楚,
的哪一部分?(注意:它是Singleton,不是Singleton、Singleon或Singleton)我的父Singleton构造函数看起来像什么父::u construct(“mysql:host=localhost;dbname=database”、“user”、“password”)@Java:在这个例子中,我扩展了类PDO,所以PDO就是那个方法。@Java:由于Singleton必须有一个
getInstance()
方法,接口将定义您必须在类中声明它。@TimCooper$instance=new Database();应为self::$instance=new Database()@哈菲丘克:谢谢。我错过了那个。你能试着把你写的代码解释一下吗?
<?
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();
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);
    }
}