一文带你搞懂PHP单例模式

作者:程序员-南 时间:2023-05-25 02:23:05 

简介

单例模式是创建型对象的一种,用于如何优雅的创建对象。

让一个类最多产生一个对象。

场景

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

优点

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

缺点

对象生命周期都是页面级的,每次页面被执行时,都会重新建立新的对象,都会在页面执行完毕后被清空,这样似乎PHP单例模式意义不大。

示例代码

class Demo {
   //声明一个存储对象的方法
   private static $obj;
   //防止当前类的外部进行实例化
   private function __construct() {}
   //防止当前类的外部进行克隆
   private function __clone() {}
   //声明一获取示例的方案
   public static function getInstance() {
       if(self::$obj === null) {
           self::$obj = new self();
       }
       return self::$obj;
   }
   public function otherFunction() {
       //todo ...
   }
}

测试代码:

class Demo {
   //声明一个存储对象的方法
   private static $obj;
   //防止当前类的外部进行实例化
   private function __construct() {}
   //防止当前类的外部进行克隆
   private function __clone() {}
   //声明一获取示例的方案
   public static function getInstance() {
       if(self::$obj === null) {
       //在此处打印数据到文件,可清楚的看出来执行了几次。
       //静态方法或者静态属性可以称之为类变量或者类属性,会随着类的加载一并加载到内存当中。
           file_put_contents('F:/stdout.txt', 1,FILE_APPEND);
           self::$obj = new self();
       }
       return self::$obj;
   }
   public function otherFunction() {
       //todo ...
   }
}
//类的外部执行了5次实例化操作
for($i = 0; $i < 5; $i++) {
   Demo::getInstance();
}

升级版本:

如果每一个类都写一个单例模式的话,会显得有重复的代码,为此可以用继承去解决这个问题。

此时self就需要修改为static,不然self是当前对象而不是子类对象。

static::方法或属性,这种使用称为后期静态绑定。

这和但是static 修饰成员属性或者成员方法,一个是使用,一个是修饰。

class Singleton {
   //声明一个存储对象的方法
   private static $obj;
   //防止当前类的外部进行实例化
   private function __construct() {}
   //防止当前类的外部进行克隆
   private function __clone() {}
   //声明一获取示例的方案
   public static function getInstance() {
   //检测$obj是否为空并是否不属于当前类
       if(((static::$obj === null) && (! static::$obj instanceof static))) {
           static::$obj = new static();
       }
       return static::$obj;
   }
}
class Test extends Singleton {
   public function func() {
       return mt_rand(0, 10);
   }
}
//使用:
Test::getInstance()->func();

来源:https://blog.csdn.net/qq_42342282/article/details/127692950

标签:PHP,单例模式,设计模式
0
投稿

猜你喜欢

  • HTML编写小经验

    2011-06-14 09:43:14
  • Response.Flush的使用心得

    2010-04-08 12:57:00
  • 用Dreamweaver实现Real与网页结合

    2010-07-13 12:11:00
  • 利用CSS属性实现进度条的方式

    2010-02-25 12:31:00
  • CSS nuggets CSS金矿

    2009-10-28 18:59:00
  • asp 采集程序常用函数分析

    2011-03-16 11:03:00
  • ASP+SQLServer2000 经验积累

    2008-02-03 15:16:00
  • 如何使用SQL Server中的客户端配置工具

    2009-01-13 14:05:00
  • 数据库手边系列:SQL Server数据表信息

    2009-05-24 18:26:00
  • 如何在SQL Server数据库中加密数据

    2008-12-18 14:27:00
  • ASP中使用FileSystemObject时提高性能的一个小技巧

    2008-06-08 13:09:00
  • asp 多关键词搜索的简单实现方法

    2011-04-11 10:45:00
  • 资料:MsSQL常用SQL语句

    2009-02-23 12:54:00
  • DIV与Table布局在大型网站的可用性比较

    2007-10-08 12:46:00
  • asp显示左边的n个字符自动识别汉字的函数

    2007-09-13 12:16:00
  • 下载 Firefox 3 中文版/英文版

    2008-06-19 13:27:00
  • 详细介绍查询优化技术在现实系统中的运用

    2009-01-04 13:34:00
  • utf-8 网页不显示+utf-8网页乱码的通用解决方法

    2011-04-19 10:47:00
  • 卸载VS2011 Developer Preview后Sql Server2008 R2建立数据库关系图报“找不到指定的模块”错误的解决方法

    2011-11-03 16:49:09
  • Quester解读17条广告效果测定

    2007-11-27 12:51:00
  • asp之家 网络编程 m.aspxhome.com