PHP的单例模式是什么?单例模式怎么用?-创新互联

PHP的单例模式是什么?单例模式怎么用?这些问题可能是我们日常工作会见到的。通过这些问题,希望你能收获更多。下面是揭开这些问题的详细内容。

创新互联建站,为您提供成都网站建设公司成都网站制作、网站营销推广、网站开发设计,对服务门窗定制等多个行业拥有丰富的网站建设及推广经验。创新互联建站网站建设公司成立于2013年,提供专业网站制作报价服务,我们深知市场的竞争激烈,认真对待每位客户,为客户提供赏心悦目的作品。 与客户共同发展进步,是我们永远的责任!

什么是单例模式?

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

为什么要使用单例?

  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的单例模式有进一步的了解吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注创新互联成都网站设计公司行业资讯频道,感谢各位的阅读!

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


网页标题:PHP的单例模式是什么?单例模式怎么用?-创新互联
分享链接:http://myzitong.com/article/egeig.html