我们设计php时总会遇到一些问题,我们有很多个对象,希望他们共享成员,并且保持一致的状态,我们也允许他继承,有的时候别人也叫单件模式:就是某个类只产生一个实例,无论你在哪个地方用,他们都是一个东西。

<?php
class Singleton {

private static $instance;
private static $outSentence;

//*****************************************************
// 封装构造函数,使该类外部无法创建对象,也就只能通过在
// 类的内部对其自身实例化
//*****************************************************
private function __construct() {
self::$outSentence ="You have ben success!";
echo "Hei! I'm the __construct in the class of Singleton,
when you see this,it means you hava created a Singleton
instance successfully in the class Singleton itself!";
}

//*****************************************************
// 在类内部用成员方法将其自身实例化,并将该方法静态化,
// 这样就可以通过类直接访问该方法并取得对象
//*****************************************************
public static function getInstance() {
if(!isset(self::$instance)){
$c = __CLASS__;
self::$instance = new $c;
}
return self::$instance;
}

public function setSentence($sentence) {
self::$outSentence = $sentence;
}

public function outPutSentence() {
echo "&lt;br&gt;".self::$outSentence;
}

//*****************************************************
// 在PHP5中有clone关键字,可以将一个对象克隆(注意,不是
// 单单的句柄引用),所以要实现单态,还必须用魔术方法把
// 外部的对象clone功能给阻止掉!!!
//*****************************************************
public function __clone() {
trigger_error('Clone is not allowed.',E_USER_ERROR);
}

function __destruct() {
echo "&lt;br&gt;The instance is destorying now!!!!!!!!!!!";
}

}

Singleton::getInstance()-&gt;outPutSentence();
Singleton::getInstance()-&gt;setSentence("I'm just having a try!");
Singleton::getInstance()-&gt;outPutSentence();
Singleton::getInstance()-&gt;setSentence("xiaowei");
Singleton::getInstance()-&gt;outPutSentence();

这是我们的一个实例,大家可以看一下,然后我写了一个数据库链接的
<?php
class db
{
private static $instance=false;
public static function instance($host,$name,$pass,$dbname)
{
if(self::$instance===false)
{
self::$instance=new db(......);
}
return self::$instance;
}

private function __construct()
{
/*这个函数必须是私有的,它保证了只能通过单例生成器来获得实例*/
}

public function __clone()
{
/*什么也不做*/
}
}
?>

这样做有什么好处 无论我们在任何地方使用 都是这样的 $db=db::instance(...);数据库统一了不会再重新打开链接了,这样不就提高效率了吗?

要是我们有好多台服务器,链接的数据库不一样怎么办,简单申明的时候我们申明成数组
private static $instance=array();
public static function instance($host,$name,$pass,$dbname)
{
$hash=$host.$name.$pass.$dbname;
if(!isset(self::$instance[$hash]) || self::instance[$hash]===false )
{
self::$instance[$hash]=new db(......);
}
return self::$instance;
}
就是这样了,如果您有什么不懂的可以联系我,当然说了单态模式,我会对大家讲一下什么叫做工厂模式,因为有人区分不开它,如果您有什么疑问请留言,或者直接联系我。 欢迎转载,转载请注明来自微度网络http://yun.widuu.com

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部