【设计模式】PHP单例模式的应用场景和实现
发布:smiling 来源: PHP粉丝网 添加日期:2022-06-18 10:36:08 浏览: 评论:0
摘要
什么是单例模式?
一个类只允许创建一个对象(或者实例),那这个类就是一个单例类,这种设计模式就叫作单例设计模式,简称单例模式。
为什么要使用单例?
处理资源访问冲突。
例如:往文件中打印日志的功能。
表示全局唯一类。
从业务概念上,如果有些数据在系统中只应保存一份,那就比较适合设计为单例类。例如:唯一递增 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号码生成器就出现了。
- class single
- {
- private $id = 0;
- private static $instance ;
- private function __construct(){}
- private function __clone(){}
- public static function getInstance() {
- if (emptyempty(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的多线程我也没用过,看起来是条不归路,不知道大家怎么看。
Tags: PHP单例模式 PHP应用场景
- 上一篇:关于php变量申明和内存中的存放方式
- 下一篇:最后一页
相关文章
- ·php单例模式笔记(2014-10-22)
- ·PHP单例模式实例浅析(2015-04-11)
- ·PHP设计模式-单例模式学习笔记(2015-12-10)
- ·PHP中单例模式与工厂模式详解(2018-08-02)
- ·PHP中数据库单例模式的实现代码分享(2021-04-07)
- ·php实现singleton()单例模式实例(2021-04-24)
- ·浅析php单例模式(2021-04-30)
- ·php单例模式示例分享(2021-05-13)
- ·php设计模式之单例模式实例分析(2021-05-14)
- ·PHP单例模式详细介绍(2021-06-06)
- ·php面向对象值单例模式(2021-07-31)
- ·PHP单例模式是什么 php实现单例模式的方法(2021-08-05)
- ·PHP中单例模式的使用场景与使用方法讲解(2021-11-13)
- ·PHP设计模式之单例模式定义与用法分析(2021-11-14)
- ·PHP工厂模式、单例模式与注册树模式实例详解(2021-11-24)
- ·php设计模式之单例模式用法经典示例分析(2021-12-19)
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)