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