当前位置:首页 > PHP教程 > php面向对象 > 列表

一文带你搞懂PHP单例模式

发布:smiling 来源: PHP粉丝网  添加日期:2023-06-23 12:11:49 浏览: 评论:0 

单例就是单实例的意思,即在系统全局,一个类只创建一个对象,并且在系统全局都可以访问这个对象而不用重新创建。本文将通过示例为大家详细讲解Java单例模式的使用,需要的可以参考一下。

简介

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

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

场景

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

优点

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

缺点

对象生命周期都是页面级的,每次页面被执行时,都会重新建立新的对象,都会在页面执行完毕后被清空,这样似乎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.     } 

测试代码:

  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. //类的外部执行了5次实例化操作 
  22. for($i = 0; $i < 5; $i++) { 
  23.     Demo::getInstance(); 

升级版本:

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

此时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. class Test extends Singleton { 
  17.     public function func() { 
  18.         return mt_rand(0, 10); 
  19.     } 
  20. //使用: 
  21. Test::getInstance()->func();

Tags: PHP单例模式

分享到: