设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 创业者 手机 数据
当前位置: 首页 > 站长学院 > PHP教程 > 正文

设计模式PHP单例模式的应用场景及实现

发布时间:2022-06-24 13:13 所属栏目:121 来源:互联网
导读:摘要 什么是单例模式? 一个类只允许创建一个对象(或者实例),那这个类就是一个单例类,这种设计模式就叫作单例设计模式,简称单例模式。 为什么要使用单例? 处理资源访问冲突。 例如:往文件中打印日志的功能。 表示全局唯一类。 从业务概念上,如果有些
  摘要
 
  什么是单例模式?
 
  一个类只允许创建一个对象(或者实例),那这个类就是一个单例类,这种设计模式就叫作单例设计模式,简称单例模式。
 
  为什么要使用单例?
 
  处理资源访问冲突。
 
  例如:往文件中打印日志的功能。
 
  表示全局唯一类。
 
  从业务概念上,如果有些数据在系统中只应保存一份,那就比较适合设计为单例类。例如:唯一递增 ID 号码生成器。
 
  实现方式
 
  实现php的单例模式需要三个步骤
 
  * 一个静态成员变量,用来保存类。
 
  * 为防止对象创建或者克隆,需要吧__construct和__clone声明为私有。
 
  * 一个访问这个实例的公共的静态方法,通常为getInstance
 
  class single
  
  {
  
      private static  $instance ;
  
      private function __construct(){}
  
      private function __clone(){}
  
      public static function getInstance() {
  
          if (emptyempty(self::$instance)) {
  
              self::$instance = new single();
  
          }
  
          return self::$instance;
  
      }
  
  }
  给单例类加上一个方法,获取ID。一个全局唯一的id号码生成器就出现了。
 
  实现一个线程唯一的单例
 
  这里不得不提到php的ts和nts版本区别,nts(Non Thread Safe)单线程构建,线程间共用缓存数据。ts(Thread Safe)具有多线程功能的构建,多个线程间使用不同的数据副本。
 
  使用ts版本的php自动升级为线程安全模式,pthreads扩展只能安装在ts版本的php上。
 
  pecl收录的最后一个版本pthreads就是基于php7.0,github上的pthreads项目也已经停止更新,感兴趣只能去7.0怀念历史了。
 
  我在php-7.0.9-Win32-VC14-x64 这个版本下安装了pthreads扩展。
 
  多线程的情况下,单例的范围就从进程唯一变成了线程唯一了。
 
  require 'single.php';
  
  class Request extends Thread {
  
      public $url;
  
      public function __construct($url) {
  
          $this->url = $url;
  
      }
  
      public function run() {
  
          echo single::getInstance()->getId();
  
          echo "\n";
  
      }
  
  }
  
  $chG = new Request("www.google");
  
  $chG ->start();
  
  $chG->join();
  
  echo $chG->getThreadId();
  
  echo "\n";
  
  $chB = new Request("www.baidu");
  
  $chB ->start();
  
  $chB->join();
  
  echo $chB->getThreadId();
  
  echo "\n";
  这里创建了两个线程,但两次执行都可以获得从0开始的id,说明两个线程内的single类是两个不同的单例对象。
 
  总结
 
  实现php的单例模式需要三个步骤
 
  * 一个静态成员变量,用来保存类。
 
  * __construct和__clone声明为私有,防止创建或者克隆。
 
  * 一个静态方法,通常为getInstance,用来访问这个实例。
 
  php的多线程我也没用过,看起来是条不归路,不知道大家怎么看。
 
 

(编辑:ASP站长网)

    网友评论
    推荐文章
      热点阅读