当前位置:博客首页>>片言碎语 >> 阅读正文

【设计模式】php设计模式之单例模式学习

作者: 郑晓 分类: 片言碎语 发布于: 2014-06-17 18:17 浏览:4,267 评论(2)


什么是单例模式,单例模式顾名思义,就是只有一个实例。作为对象的一种创建模式, 单例模式确保了某一个类有且只有一个实例,而且通过自身完成实例化并向整个系统提供这个实例。

一个单例模式的类,要具备以下几点要求:
1、构造函数须要标记为private(访问控制:声明为私有方法,防止外部代码直接使用new来创建对象),单例类不能在其他类中实例化,只能被其自身实例化。
2、拥有一个保存类的实例的私有静态成员变量。
3、拥有一个访问这个实例的公共的静态方法(一般常用getInstance()方法进行实例化类,或返回已经实例化的对象,通过instanceof操作符可以检测到类是否已经被实例化)
4、需要创建__clone()方法防止对象被复制(克隆),当代码中使用clone操作符进行对象克隆时会调用这个方法。

为什么使用PHP单例模式?

1. php的单例主要应用于数据库应用中, 一般在一个应用中会存在大量的数据库操作, 在使用面向对象的方式开发时, 如果使用单例模式, 则可以避免大量的new 操作消耗的资源,还可以减少数据库连接这样就不容易出现too many connections情况。

2. 如果系统中需要有一个类来全局控制某些配置信息, 那么使用单例模式可以很方便的实现。

3. 在一次页面请求中, 便于进行调试, 因为所有的代码(例如数据库操作类db)都集中在一个类中, 我们可以在类中设置钩子, 输出日志,从而避免到处的打印。。。

<?php
/**
* 设计模式之单例模式
* $_instance必须声明为静态的私有变量
* 构造函数必须声明为私有,防止外部程序new类从而失去单例模式的意义
* getInstance()方法必须设置为公有的,必须调用此方法以返回实例的一个引用
* ::操作符只能访问静态变量和静态函数
* new对象都会消耗内存
* 使用场景:最常用的地方是数据库连接。
* 使用单例模式生成一个对象后,该对象可以被其它众多对象所使用。
*/

class demo {
//保存例实例在此属性中
  private static $_instance;

  //构造函数声明为private,防止直接创建对象
  private function __construct() {
    echo '我被实例化了!';
  }

  //单例方法
  static function get_instance() {
    if(!isset(self::$_instance)) {
      self::$_instance=new self();
    }
    return self::$_instance;
  }

  //阻止用户复制对象实例
  private function __clone() {
    trigger_error('不允许复制!' ,E_USER_ERROR);
  }

  function test() {
    echo("test");

  }
}

// 这个写法会出错,因为构造方法被声明为private
//$test = new demo;

// 下面将得到类的单例对象,执行后会发现构造方法只会调用一次。
$test1 = demo::get_instance();
$test2 = demo::get_instance();
$test3 = demo::get_instance();

$test1->test();

//复制对象将导致一个E_USER_ERROR错误.
$test4 = clone $test;
?>
       

本文采用知识共享署名-非商业性使用 3.0 中国大陆许可协议进行许可,转载时请注明出处及相应链接。

本文永久链接: https://www.zh30.com/she-ji-mo-shi-php-she-ji-mo-shi-zhi-dan-li.html

【设计模式】php设计模式之单例模式学习:目前有2 条留言

用户评论头像 刘春晓的博客发表于 2014年06月22日 17:34[回复]

你好 朋友 有没有兴趣做友情链接

用户评论头像 女装屋发表于 2014年06月18日 00:52[回复]

😎 😎 😆 学习了

发表评论

change vcode