浅谈PHP设计模式的单例模式

打印 上一主题 下一主题

主题 1404|帖子 1404|积分 4227

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
简介:

单例模式是创建型对象的一种,用于如何优雅的创建对象。
让一个类最多产生一个对象。
场景:

只需要一个对象就能解决并且要使用多次的场景,比如框架的数据库连接。
优点:

减少资源消耗,一个对象能完成的事情,就不需要再实例化出来同样的东西。
缺点:

对象生命周期都是页面级的,每次页面被执行时,都会重新建立新的对象,都会在页面执行完毕后被清空,这样似乎PHP单例模式意义不大。
示例代码:
  1. class Demo {
  2.     //声明一个存储对象的方法
  3.     private static $obj;
  4.     //防止当前类的外部进行实例化
  5.     private function __construct() {}
  6.     //防止当前类的外部进行克隆
  7.     private function __clone() {}
  8.     //声明一获取示例的方案
  9.     public static function getInstance() {
  10.         if(self::$obj === null) {
  11.             self::$obj = new self();
  12.         }
  13.         return self::$obj;
  14.     }
  15.     public function otherFunction() {
  16.         //todo ...
  17.     }
  18. }
复制代码
测试代码:
  1. class Demo {
  2.     //声明一个存储对象的方法
  3.     private static $obj;
  4.     //防止当前类的外部进行实例化
  5.     private function __construct() {}
  6.     //防止当前类的外部进行克隆
  7.     private function __clone() {}
  8.     //声明一获取示例的方案
  9.     public static function getInstance() {
  10.         if(self::$obj === null) {
  11.         //在此处打印数据到文件,可清楚的看出来执行了几次。
  12.         //静态方法或者静态属性可以称之为类变量或者类属性,会随着类的加载一并加载到内存当中。
  13.             file_put_contents('F:/stdout.txt', 1,FILE_APPEND);
  14.             self::$obj = new self();
  15.         }
  16.         return self::$obj;
  17.     }
  18.     public function otherFunction() {
  19.         //todo ...
  20.     }
  21. }
  22. //类的外部执行了5次实例化操作
  23. for($i = 0; $i < 5; $i++) {
  24.     Demo::getInstance();
  25. }
复制代码
升级版本:

如果每一个类都写一个单例模式的话,会显得有重复的代码,为此可以用继承去解决这个问题。
此时self就需要修改为static,不然self是当前对象而不是子类对象。
static::方法或属性,这种使用称为后期静态绑定。
这和但是static 修饰成员属性或者成员方法,一个是使用,一个是修饰。
  1. class Singleton {
  2.     //声明一个存储对象的方法
  3.     private static $obj;
  4.     //防止当前类的外部进行实例化
  5.     private function __construct() {}
  6.     //防止当前类的外部进行克隆
  7.     private function __clone() {}
  8.     //声明一获取示例的方案
  9.     public static function getInstance() {
  10.             //检测$obj是否为空并是否不属于当前类
  11.         if(((static::$obj === null) && (! static::$obj instanceof static))) {
  12.             static::$obj = new static();
  13.         }
  14.         return static::$obj;
  15.     }
  16. }
  17. class Test extends Singleton {
  18.     public function func() {
  19.         return mt_rand(0, 10);
  20.     }
  21. }
  22. //使用:
  23. Test::getInstance()->func();
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

大连全瓷种植牙齿制作中心

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表