面向对象中的单例模式(PHP)

单例模式的主要作用是保证在面向对象编程设计中,一个类只能有一个实例对象的存在。在很多操作中,比如建立目录、数据库连接都有可能会用到这种技术。和其他面向对象的编程语言相比,PHP中使用单例设计尤为重要。因为PHP是脚本语言,每次访问都是一次独立执行的过程,而在这个过程中一个类中有一个实例对象就足够了。例如自定义数据库的操作类,设计的原则就是在一个脚本中,只需要实例化一个数据库操作类的对象,并且只连接一次数据库就可以了,而不是在一个脚本中为了执行对个SQL语句,单独为每个SQL语句实例一个对象,因为实例化一次就要连接一次数据库,这样非常降低效率,单例模式就为我们提供了这样实现的可能。另外,使用单例的另一个好处在于可以节省内存,因为它限制了实例对象的个数。

<?php
/**
 * 声明一个类Db,用于演示单例模式的使用
 */
class DB{
  //声明一个私有的,静态的成员属性$obj;因为静态方法只能访问
  private static $obj = null;

  /*构造方法,使用private封装后则只能在类的内部使用new去创建对象*/
  private function __construct(){
    /*在这个方法中完成一些数据库连接等操作*/
    echo "数据库连接成功!";
  }

  //只有通过这个方法才能返回本类的对象,该方法是静态方法,用类名调用
  static function getInstance(){
    if(is_null(self::$obj)){//如果本类中的$obj为空,说明还没有被实例化过
      self::$obj = new self();//实例化本类对象
    }
    return self::$obj;
  }

  //执行SQL语句完成数据库的操作
  function query($sql){
    echo $sql;
  }
}

//只能使用静态方法getInstance()去获取DB类的对象
$db = DB::getInstance();

//访问对象中的成员
$db -> query("select * from user");
 ?>

要编写单例设计模式,就必须让一个类只能实例化一个对象,而想让一个类只实例化一个对象,就先要让一个类不能实例化对象。在上例中,不能在类的外部直接使用new关键字去实例化DB类的对象,是因为DB类的构造方法使用了private关键字进行了封装。但根据封装的原则我们可以在类的内部方法中实例化本类的对象,所以声明了一个getInstance()方法,并在该方法中实例化本类的对象。但成员方法也是需要对象才能访问的,所以在getInstance()方法前使用static关键字修饰,成为静态方法就不使用对象,而是通过类名来访问了。如果调用一次getInstance()方法,就在该方法内实例化一次本类对象,这并不是我们想要的结果。所以就需要声明一个成员属性$obj,将实例化的对象引用赋值给它,再判断该变量,如果已经有值,就直接返回,如果值是null,就去实例化对象,这样就能保证DB类只被实例化一次。又因为getInstance()方法是static修饰的静态方法,静态方法又不能访问非静态的成员,所以成员属性$obj也必须是一个静态成员,而且又不能让外部类直接访问,所以也需要使用private关键字封装起来。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值