【设计模式】PHP单例模式的应用场景和实现

互联网 20-6-2
摘要

什么是单例模式?

一个类只允许创建一个对象(或者实例),那这个类就是一个单例类,这种设计模式就叫作单例设计模式,简称单例模式。

为什么要使用单例?

  1. 处理资源访问冲突。

实现方式

实现php的单例模式需要三个步骤

* 一个静态成员变量,用来保存类。

* 为防止对象创建或者克隆,需要吧__construct和__clone声明为私有。

class single {     private static  $instance ;     private function __construct(){}     private function __clone(){}     public static function getInstance() {         if (empty(self::$instance)) {             self::$instance = new single();         }         return self::$instance;     } }
class single {     private  $id = 0;     private static  $instance ;     private function __construct(){}     private function __clone(){}     public static function getInstance() {         if (empty(self::$instance)) {             self::$instance = new single();         }         return self::$instance;     }     public function getId() {                  return $this->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";

总结

实现php的单例模式需要三个步骤

* 一个静态成员变量,用来保存类。

* __construct和__clone声明为私有,防止创建或者克隆。

php的多线程我也没用过,看起来是条不归路,不知道大家怎么看。

以上就是【设计模式】PHP单例模式的应用场景和实现的详细内容,更多内容请关注技术你好其它相关文章!

来源链接:
免责声明:
1.资讯内容不构成投资建议,投资者应独立决策并自行承担风险
2.本文版权归属原作所有,仅代表作者本人观点,不代表本站的观点或立场
标签: 单例模式
上一篇:php获取远程图片并下载保存到本地的方法分析 下一篇:一个简单QQ群聊案例代码解析(PHP实现)

相关资讯