什么是单例模式?
在整个应用中通过这个类只能实例化一个对象实例的设计模式
模式分类?
在所有模式设计中,有三种基础设计模式,单例模式,工厂模式,注册树模式,其他模式往往基于这几种模式,今天带来的是单例模式。
为什么要用单例模式?
1。php常常和数据库打交道,如果在应用中频繁建立连接对象,进行new操作的话,会消耗大量的系统内存资源。(节省资源开销)
2。在团队合作项目中,单例模式可以有效避免不同程序员new自己的对象时,造成人为的系统消耗。(节省资源开销)
------------------实现单例3部曲+1曲------------------
第一步:封装构造方法 private __construct( ) { }
原因: 构造函数在 new 出对象的时候第一个调用的方法 构造函数被申明为private或者protected这注定无法通过new的方法创建实例对象了。
第二步: 通过类内的方法来创建对象实例。 static Single(){ }
原因:我们往往往往是创建了对象后才调用对象的方法,而此时需要调用类里面的方法来创建对象。不受是否创建对象影响都能调用的方法的解决方案毋庸置疑那就是利用关键字--static
第三步:定义一个封装的静态变量 private static $instance
原因:把实例化的唯一对象放在这个变量里面存起来
第四步(加1曲):私有化克隆的魔术方法:__c l o n e ();
原因:对于一个类的对象,如果使用“clone运算符”,就会克隆出一个跟当前对象完全一样的新对象出来,并且:此时这个新对象还会自动调用该类中的魔术方法:_ _c l o n e ();只要其中有该方法;
代码演示
1 <?php 2 3 class Sing { 4 5 //第三步:定义一个变量 6 private static $instance= null; 7 8 //第一步:封装构造函数 9 private function __construct(){ 10 11 } 12 13 //第二步:使用类名调用这个类创建对象实例 14 static function getSingle(){ 15 if( !(self::$instance instanceof self) ){ //instanceof判断一个对象是否是某个类的实例 16 self::$instance = new self(); //用变量来存储实例化出来的对象 17 } 18 return self::$instance; 19 } 20 21 22 //第四步:禁止克隆实例化出来的对象 23 private function __clone(){ } 24 25 } 26 27 $danli = Sing::getSingle(); 28 var_dump($danli); //输出 object(Sing)#1 (0) { } 29 $danli2 = Sing::getSingle(); 30 var_dump($danli2); //输出 object(Sing)#1 (0) { } 31 32 $obj3 = clone $danli; //此处禁止克隆单例对象实例 33 var_dump($obj3); //Call to private Sing::__clone() from context '' in 错误行号 34 35 36 ?>