100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > 【设计模式】PHP单例模式的应用场景和实现

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

时间:2020-02-16 15:44:27

相关推荐

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

后端开发|php教程

单例模式

后端开发-php教程

摘要

listview 文件管理器vb源码,vscode是免费软件吗,ubuntu日志轮转,tomcat站点路径设置,网页爬虫回圈,php如何判断数据类型,搜索引擎优化seo咨询lzw

什么是单例模式?

PHP赞名片源码,vscode网页版网址,ubuntu ip地址,tomcat运行原理 豆瓣,dth爬虫,php fprintf,什么是seo论坛推广,小说txt下载网站源码,手机网站 html模板下载工具lzw

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

安卓手机网页源码,vscode转化语言,鸟哥的私房菜适合ubuntu吗,Tomcat未部署,sqlite 2位小数,免插件米奇亚洲,前端可编辑列表框架,python爬虫下载图片函数,php 日期星期,产品seo标题,discuz做小说网站,模块化 网页,app注册页面html模板lzw

为什么要使用单例?

处理资源访问冲突。

例如:往文件中打印日志的功能。

表示全局唯一类。

从业务概念上,如果有些数据在系统中只应保存一份,那就比较适合设计为单例类。例如:唯一递增 ID 号码生成器。

实现方式

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

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

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

* 一个访问这个实例的公共的静态方法,通常为getInstance

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; }}

给单例类加上一个方法,获取ID。一个全局唯一的id号码生成器就出现了。

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";

这里创建了两个线程,但两次执行都可以获得从0开始的id,说明两个线程内的single类是两个不同的单例对象。

总结

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

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

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

* 一个静态方法,通常为getInstance,用来访问这个实例。

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。