码迷,mamicode.com
首页 > Web开发 > 详细

PHP单例模式简记

时间:2018-01-09 20:15:15      阅读:243      评论:0      收藏:0      [点我收藏+]

标签:str   img   new t   如何   gpo   ret   对象   size   test   

单例模式只能实例化一次即为单例模式

如何实现只能实例化一次:突破口在于类的构造函数,我们把构造方法变为隐私或者受保护的方法,然后执行代码

<?php 

 Class Temp {
     protected function __construct () {

     }
 }

 $test = new Temp();

上面的代码执行会有如下报错

技术分享图片

这样的话就不能实例化了,别人也不能随便的实例化它,但是我们自己应该如何实例化它呢?进一步修改代码

<?php 

 Class Temp {
     protected function __construct () {

     }

     public static function getInstance () {
         $test = new Temp();
         return $test;
     }
 }

 // $test = new Temp();
 $test = Temp::getInstance();

 var_dump($test);

运行代码,便可以得到一个对象

技术分享图片

这说明我们已经成功的实例化了这个类,这说明我们成功的实例化了这个类。

但是这并没有达到我们要的目的,修改代码如下

<?php 

 Class Temp {
     protected function __construct () {

     }

     public static function getInstance () {
         $test = new Temp();
         return $test;
     }
 }

 // $test = new Temp();
 $test1 = Temp::getInstance();
 $test2 = Temp::getInstance();
 $test3 = Temp::getInstance();

 if ($test1 === $test2) {
     echo 同一个;
 } else {
     echo 不是同一个;
 }

执行代码

技术分享图片

等到else的结果,这证明这是两个不一样的实例,也就是说我们并没有实现单例,继续修改代码如下

<?php 

 Class Temp {
     protected function __construct () {

     }

     public static function getInstance () {
         static $test;
         if (empty($test)) {
             $test = new Temp();
         }
         return $test;
     }
 }

 // $test = new Temp();
 $test1 = Temp::getInstance();
 $test2 = Temp::getInstance();
 $test3 = Temp::getInstance();

 if ($test1 === $test2) {
     echo 同一个;
 } else {
     echo 不是同一个;
 }

运行代码

技术分享图片

这次获得的结果为条件成立的结果,证明这两个实例其实是同一个实例,到此我们便实现了我们的目的,这个类只会被实例化一次,此即为单例模式。

 

PHP单例模式简记

标签:str   img   new t   如何   gpo   ret   对象   size   test   

原文地址:https://www.cnblogs.com/cyclzdblog/p/PHP.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!