我们设计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 "<br>".self::$outSentence; } //***************************************************** // 在PHP5中有clone关键字,可以将一个对象克隆(注意,不是 // 单单的句柄引用),所以要实现单态,还必须用魔术方法把 // 外部的对象clone功能给阻止掉!!! //***************************************************** public function __clone() { trigger_error('Clone is not allowed.',E_USER_ERROR); } function __destruct() { echo "<br>The instance is destorying now!!!!!!!!!!!"; } } Singleton::getInstance()->outPutSentence(); Singleton::getInstance()->setSentence("I'm just having a try!"); Singleton::getInstance()->outPutSentence(); Singleton::getInstance()->setSentence("xiaowei"); Singleton::getInstance()->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
发表评论 取消回复