百分百源码网-让建站变得如此简单! 登录 注册 签到领金币!

主页 | 如何升级VIP | TAG标签

当前位置: 主页>网站教程>网页制作> 【设计模式】PHP单例模式的利用场景和实现
分享文章到:

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

发布时间:09/01 来源:未知 浏览: 关键词:
摘要

什么是单例模式?

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

为什么要使用单例?

  1. 处置资源拜访冲突。

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

  2. 表示全局独一类。

从业务概念上,假如有些数据在系统中只应留存一份,那就比力适合设计为单例类。例如:独一递增 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单例模式的利用场景和实现的具体内容,更多请关注百分百源码网其它相关文章!

打赏

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

百分百源码网 建议打赏1~10元,土豪随意,感谢您的阅读!

共有150人阅读,期待你的评论!发表评论
昵称: 网址: 验证码: 点击我更换图片
最新评论

本文标签

广告赞助

能出一分力是一分吧!

订阅获得更多模板

本文标签

广告赞助

订阅获得更多模板