【设计模式】PHP单例模式的利用场景和实现
什么是单例模式?
一个类只同意创立一个对象(或者实例),那这个类就是一个单例类,这种设计模式就叫作单例设计模式,简称单例模式。
为什么要使用单例?
处置资源拜访冲突。
例如:往文件中打印日志的功效。
表示全局独一类。
从业务概念上,假如有些数据在系统中只应留存一份,那就比力适合设计为单例类。例如:独一递增 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的多线程我也没用过,看起来是条不归路,不知道大家如何看。
以上就是【设计模式】PHP单例模式的利用场景和实现的具体内容,更多请关注百分百源码网其它相关文章!