设为首页 收藏本站
查看: 1249|回复: 0

[经验分享] php设计模式——单例模式

[复制链接]

尚未签到

发表于 2015-8-23 16:14:33 | 显示全部楼层 |阅读模式
单例模式概念

单例模式是指整个应用中类只有一个对象实例的设计模式。单例模式的特点


  • 一个类在整个应用中只有一个实例
  • 类必须自行创建这个实例
  • 必须自行向整个系统提供这个实例
php中使用单例模式的原因

我用php大部分操作都是和各种数据库打交道,包括mysql,redis,memcache等各种关系型和非关系型数据库,所以一个应用中会 存在大量连接数据库的操作,如果不用单例模式,那每次都要new操作,但是每次new都会消耗大量的内存资源和系统资源,而且每次打开和关闭数据库连接都 是对数据库的一种极大考验和浪费。
贴出我之前常用的不好的数据库连接代码,给大家一个错误示范:


  • <?php  
  • class MysqlConn  
  • {  
  •     // MYSQL数据库连接信息  
  •     const MYSQLHOSTNAME = "127.0.0.1";  
  •     const MYSQLUSERNAME = "root";  
  •     const MYSQLPASSWORD = "***";  
  •     const MYSQLDBNAME = "test";  
  •     const MYSQLCHARSET = "utf8";  
  •       
  •     /**
  •     * Description:mysql数据库连接函数
  •     * Return value:连接成功返回数据库连接句柄;连接失败返回错误消息
  •     */  
  •     public function MysqlConnect()  
  •     {  
  •         $db = new mysqli(self::MYSQLHOSTNAME, self::MYSQLUSERNAEM, self::MYSQLPASSWORD, self::MYSQLDBNAME); // 连接数据库  
  •         $db->set_charset(self::MYSQLCHARSET);  
  •         if (mysqli_connect_errno())  
  •         {  
  •             throw new CircleMysqlException("服务器系统故障", 1001);  
  •         }  
  •         else  
  •         {  
  •             return $db;  
  •         }  
  •     }  
  • }  

缺陷:
每次数据库连接都要new这个类,然后调用mysqlconnect方法,返回close掉,频繁的new和数据库连接关闭操作是非常消耗资源的  改进:
  每次应该直接返回当前应用中已经打开的数据库连接句柄



  • //单例模式返回数据库连接句柄  
  • $db = MysqlConn::SingleMysqlConnect();  
php单例模式的实现



  • <?php  
  • class Singleton  
  • {  
  •     /**
  •      * Description:(1)静态变量,保存全局实例,跟类绑定,跟对象无关
  •      *             (2)私有属性,为了避免类外直接调用 类名::$instance,防止为空
  •      */  
  •     private static $instance;  
  •       
  •     /**
  •      * Description:数据库连接句柄
  •      */  
  •     private $db;  
  •       
  •     /**
  •      * Description:私有化构造函数,防止外界实例化对象
  •      */  
  •     private static function __construct()  
  •     {  
  •     }  
  •       
  •     /**
  •      * Description:私有化克隆函数,防止外界克隆对象
  •      */  
  •     private function __clone()  
  •     {  
  •     }  
  •       
  •     /**
  •      * Description:静态方法,单例访问统一入口
  •      * @return Singleton:返回应用中的唯一对象实例
  •      */  
  •     public static function GetInstance()  
  •     {  
  •         if (!(self::$instance instanceof self))  
  •         {  
  •             self::$instance = new self();  
  •         }  
  •         return self::$instance;  
  •     }  
  •       
  •     /**
  •      * Description:获取数据库的私有方法的连接句柄
  •      */  
  •     public function GetDbConnect()  
  •     {  
  •         return $this->db;  
  •     }  
  • }  


  • 需要一个保存类的唯一实例的静态成员变量(通常$instance为私有变量)
  • 构造函数和克隆函数必须声明为私有的,为了防止外部程序new类从而失去单例模式意义
  • 必须提供一个访问这个实例的公共静态方法,从而返回唯一实例的一个引用

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-103095-1-1.html 上篇帖子: 怎样选择PHP的版本 下篇帖子: php面向对象学习
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表