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类吗?
答案 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);
}
}