现在位置: 首页 > 程序设计 > 正文
A+

php类的单例模式

2周前 程序设计 79 2

最近在写数据库的类封装代码,过程中肯定遇到了很多的问题,百度搜索了很多的教程,无意中注意到了类的单项模式这个方法,研究了一下,个人认为用在数据库操作的类封装非常有用,这篇文章就简单分享一下我的使用心得吧。

当然这是一个小小的案例,并不会引用数据库的方案去说这个单例模式,只是交代一下单例模式的简单用法。

那什么是单例模式,我的理解是单例模式在你的封装类里面只能有一个你自己写的访问实例,在每一次调用这个类的时候不需要重新new一个新的实例,就这么简单。

那么首先我们能想到的就是让类里面的构造方法和核心方法受到外部的限制,请看下面的代码:

  1. <?php
  2. class S {
  3.     private static $name;
  4.     private static $url;
  5.     private function __construct($a1$a2){
  6.         self::$name = $a1;
  7.         self::$url = $a2;
  8.     }
  9. }

首先这是一个名字叫S的类,类里面有两个私有静态属性和一个私有的构造方法(且构造方法传了两个参数),这个类在外部是不能访问的,如果硬是要访问,那就是程序报错。

那么问题来了,我现在就想在外部访问这个私有的构造方法,且保证不管访问多少次这个方法都只实例化一次,继续往下看。

  1. <?php
  2. class S {
  3.     private static $name;
  4.     private static $url;
  5.     private static $instance;
  6.     private function __construct($a1$a2){
  7.         self::$name = $a1;
  8.         self::$url = $a2;
  9.     }
  10.     public static function get_instance($p1$p2) {
  11.         if (!(self::$instance instanceof self)) {
  12.             self::$instance = new self($p1$p2);
  13.         }
  14.         return self::$instance;
  15.     }
  16.     public static function get_int() {
  17.         echo self::$name . ' --- ' . self::$url;
  18.     }
  19. }

我在前面代码的基础上加了一个私有属性 $instance 和两个公有方法 get_instance 、 get_int

而get_instance 这个方法就是我们这个单例模式的唯一外部访问方法,这个方法的功能是先判断这个类是否被实例化,如果没有就实例化这个类然后返回这个实例化,这两个参数其实是对应了构造函数里的两个参数,很好理解吧,如果不理解就去学学函数的参数用法吧!

然后第二个方法 get_int 就是读取或者说是显示结果用的,echo嘛,很好理解的,那做到这里一个简单的单例模式就已经算是完成了,接下来我们来访问这个单例模式:

  1. <?php
  2. class S {
  3.     private static $name;
  4.     private static $url;
  5.     private static $instance;
  6.     private function __construct($a1$a2){
  7.         self::$name = $a1;
  8.         self::$url = $a2;
  9.     }
  10.     public static function get_instance($p1$p2) {
  11.         if (!(self::$instance instanceof self)) {
  12.             self::$instance = new self($p1$p2);
  13.         }
  14.         return self::$instance;
  15.     }
  16.     public static function get_int() {
  17.         echo self::$name . ' --- ' . self::$url;
  18.     }
  19. }
  20. $aa = S::get_instance('fengsay', 'fengsay.com');
  21. $aa::get_int();

按照以上代码返回的结果就是 fengsay --- fengsay.com;

如此这个单例模式就是访问成功了,那要怎么证明这个单例模式就一定是成功的呢,其实很简单,先了解单例模式的特征是什么,就是你第一次传参的值永远不会变,意思就是说我如果在后面再写上一段代码

  1. $bb = S::get_instance('锋言锋语' , 'www.fengsay.com');
  2. $bb::get_int();

这段代码返回的值仍然是 fengsay --- fengsay.com,而不会是 锋言锋语 --- www.fengsay.com 。

不知道这样说能不能理解,我觉得很好理解的。

为什么说单例模式用在数据库操作很方便呢,因为首先不需要每一次访问数据库的时候都要去new一个新的实例,这样会造成资源的浪费和降低工作的性能,其次是访问数据库的用户密码以及地址都是不会变的,所以大家自己想想吧。。。。。

发表评论

评论列表 ( 有 79 次浏览 和 2 条评论 其中 访客有 0 条 博主有 0 条 )
  • 2周前

    我觉得……很不好理解,因为彻底不懂,只能尴尬地笑,哈哈哈。

    • 锋言锋语作者 谷歌浏览器  V2001A
      @回复
      2周前

      可能是我写得不好吧!

搜索