iis服务器助手广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >PHP中单例模式有什么用
  • 876
分享到

PHP中单例模式有什么用

2023-06-20 17:06:38 876人浏览 泡泡鱼
摘要

这篇文章主要介绍PHP中单例模式有什么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!单例模式绝对是在常用以及面试常问设计模式中排名首位的。一方面它够简单,三言两语就能说明白。另一方面,它又够复杂,它的实现不仅仅只有

这篇文章主要介绍PHP中单例模式有什么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

单例模式绝对是在常用以及面试常问设计模式中排名首位的。一方面它够简单,三言两语就能说明白。另一方面,它又够复杂,它的实现不仅仅只有一种形式,而且在Java等异步语言中还要考虑多线程的问题。所以在面试时,千万不要以为面试官出单例模式的问题就放松了,这个模式真的是可深可浅,也极其能体现一个开发者的水平。因为只要工作过一段时间,不可避免的就会接触到这个模式。

Gof类图及解释

GoF定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

GoF类图

PHP中单例模式有什么用

代码实现

class Singleton{    private static $uniqueInstance;    private $singletonData = '单例类内部数据';    private function __construct()    {        // 构造方法私有化,外部不能直接实例化这个类    }    public static function GetInstance()    {        if (self::$uniqueInstance == null) {            self::$uniqueInstance = new Singleton();        }        return self::$uniqueInstance;    }    public function SingletonOperation(){        $this->singletonData = '修改单例类内部数据';    }    public function GetSigletonData()    {        return $this->singletonData;    }}

没错,核心就是这样一个单例类,没别的了。让静态变量保存实例化后的自己。当需要这个对象的时候,调用GetInstance()方法获得全局唯一的一个对象。

$singletonA = Singleton::GetInstance();echo $singletonA->GetSigletonData(), php_EOL;$singletonB = Singleton::GetInstance();if ($singletonA === $singletonB) {    echo '相同的对象', PHP_EOL;}$singletonA->SingletonOperation(); // 这里修改的是Aecho $singletonB->GetSigletonData(), PHP_EOL;

客户端的调用,我们会发现PHP中单例模式有什么用singletonB是完全一样的对象。

  • 没错,从代码中就可以看出,单例最大的用途就是让我们的对象全局唯一。

  • 那么全局唯一有什么好处呢?有些类的创建开销很大,而且并不需要我们每次都使用新的对象,完全可以一个对象进行复用,它们并没有需要变化的属性或状态,只是提供一些公共服务。比如数据库操作类、网络请求类、日志操作类、配置管理服务等等

  • 曾经有过面试官问过,单例在PHP中到底是不是唯一的?如果在一个进程下,也就是一个fpm下,当然是唯一的。Nginx同步拉起的多个fpm中那肯定就不是唯一的啦。一个进程一个嘛!

  • 单例模式的优点:对唯一实例的受控访问;缩小命名空间;允许对操作和表示的精化;允许可变数目的实例;比类操作更灵活。

  • Laravel中在ioc容器部分使用了单例模式。关于容器部分的内容我们会在将来的Laravel系列文章中讲解。我们可以在Illuminate\Container\Container类中找到singleton方法。它调用了bind方法中的getClosure方法。继续追踪会发现他们最终会调用Container的make或build方法来进行实例化类,不管是make还是build方法,他们都会有单例的判断,也就是判断类是否被实例化过或者在容器中已存在。build中的if (!$reflector->isInstantiable())。

公司越来越大,但我们的全部公司的花名册都只有一份(单例类),保存在我们的OA系统中。怕的就是各个部门拥有各自己的花名册后会产生混乱,比如更新不及时漏掉了其他部门新入职或者离职的员工。其他部门在需要的时候,可以去查看全部的花名册,也可以在全部花名册的基础上建立修改自己部门的部分。但是在OA系统中,其实他们修改的还是那一份总的花名册中的内容,大家维护的其实都是保存在OA系统服务器中的那唯一一份真实的花名册

完整代码:https://GitHub.com/zhangyue0503/designpatterns-php/blob/master/21.singleton/source/singleton.php

实例

既然上面说过数据库操作类和网络请求类都很喜欢用单例模式,那么我们就来实现一个Http请求类的单例模式的开发。记得在很早前做Android的时候,还没有现在这么多的框架,Http请求都是自己封装的,网上的教程中大部分也都是采取的单例模式。

缓存类图

PHP中单例模式有什么用

完整源码:https://github.com/zhangyue0503/designpatterns-php/blob/master/21.singleton/source/singleton-http.php

<?php class HttpService{    private static $instance;    public function GetInstance(){        if(self::$instance == NULL){            self::$instance = new HttpService();        }        return self::$instance;    }    public function Post(){        echo '发送Post请求', PHP_EOL;    }    public function Get(){        echo '发送Get请求', PHP_EOL;    }}$httpA = new HttpService();$httpA->Post();$httpA->Get();$httpB = new HttpService();$httpB->Post();$httpB->Get();var_dump($httpA == $httpB);

说明

  • 是不是依然很简单,这里就不多说这种形式的单例了,我们说说另外几种形式的单例

  • 在Java等静态语言中,静态变量可以直接new对象,在声明PHP中单例模式有什么用

    instance = new HttpService();。这样可以省略掉GetInstance()方法,但是这个静态变量不管用不用都会直接实例化出来占用内存。这种单例就叫做饿汉式单例模式。

  • 我们的代码和例子很明显不是饿汉式的,这种形式叫做懒汉式。你要主动的来用GetInstance()获取,我才会创建对象。

  • 懒汉式在多线程的应用中,如java多线程或者PHP中使用swoole之后,会出现重复创建的问题,而且这多次创建的都不是同一个对象了。这时一般会使用双重检测来来确保全局还是只有唯一的一个对象。具体代码大家可以去自己找一下。饿汉式不会有问题,饿汉式本身就已经给静态属性赋值了,不会再改变。

  • 还有一种方式是静态内部类的创建方式。这种平常就不多见了,它的资源利用率高。将静态变量放在方法内,使静态变量成为方法内的变量而不是类中的变量。它可以让单例对象调用自身的静态方法和属性。

以上是“PHP中单例模式有什么用”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网PHP编程频道!

--结束END--

本文标题: PHP中单例模式有什么用

本文链接: https://www.lsjlt.com/news/298733.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • PHP中单例模式有什么用
    这篇文章主要介绍PHP中单例模式有什么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!单例模式绝对是在常用以及面试常问设计模式中排名首位的。一方面它够简单,三言两语就能说明白。另一方面,它又够复杂,它的实现不仅仅只有...
    99+
    2023-06-20
  • php中单例模式
    这篇文章主要为大家展示了php中单例模式,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带大家一起来研究并学习一下“php中单例模式”这篇文章吧。php有什么用php是一个嵌套的缩写名称,是英文超级文本预处理语言,它的语法混合...
    99+
    2023-06-06
  • php中单例模式的原理是什么
    php中单例模式的原理是什么?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1、说明当需要保证对象只有一个实例时,单例模式非常有用。把创建对象的控制权交给了一个单一的点,应用...
    99+
    2023-06-15
  • 原生javascript单例模式有什么用
    这篇文章主要为大家展示了“原生javascript单例模式有什么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“原生javascript单例模式有什么用”这篇文...
    99+
    2024-04-02
  • php 单例模式
    1,单例模式,属于创建设计模式,简单来说就是一个类只能有一个实例化对象,并提供一个当前类的全局唯一可访问入口; 2,例子 ...
    99+
    2023-08-31
    php 单例模式 创建设计模式
  • php单例模式怎么使用
    使用PHP实现单例模式的一种常见方式是通过定义一个私有的静态属性来保存类的实例,并使用一个公共的静态方法来获取该实例。 以下是一个简...
    99+
    2023-10-21
    php
  • PHP中如何使用单例模式?
    非常抱歉,由于您没有提供文章标题,我无法为您生成一篇高质量的文章。请您提供文章标题,我将尽快为您生成一篇优质的文章。...
    99+
    2024-05-21
  • php中单例模式的应用场景有哪些
    php中单例模式的应用场景有哪些?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。单例模式(Singleton)也叫单态模式,是设计模式中最为简单的一种模式,甚至有些模式大师都...
    99+
    2023-06-06
  • Java设计模式中单件模式有什么用
    小编给大家分享一下Java设计模式中单件模式有什么用,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!定义单件模式确保一个类只有一个实例,并提供一个全局访问点Java单件模式经典单件模式的实现public class...
    99+
    2023-06-25
  • php单例模式和工厂模式怎么应用
    单例模式和工厂模式是两种设计模式,可以在PHP中进行应用。1. 单例模式:单例模式是一种保证一个类只有一个实例对象的模式。在PHP中...
    99+
    2023-09-29
    php
  • 设计模式中的单例模式与PHP中的应用
    引言:设计模式是在软件设计过程中,经验丰富的软件工程师总结出来的一些解决特定问题的经典模式。其中,单例模式是最常用的设计模式之一。单例模式确保一个类只有一个实例,并提供了一个全局访问点来访问这个实例。在PHP中,单例模式被广泛应用于各种场景...
    99+
    2023-10-21
    单例模式 设计模式 PHP应用
  • PHP中单例模式的示例分析
    这篇文章将为大家详细讲解有关PHP中单例模式的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、什么是单例模式?含义     作为对象的创建模式,单例模式确保某一个类...
    99+
    2023-06-20
  • php设计模式中工厂模式有什么用
    这篇文章将为大家详细讲解有关php设计模式中工厂模式有什么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。使用工厂模式的目的或目标?工厂模式的最大优点在于创建对象上面,就...
    99+
    2024-04-02
  • Java中单例模式怎么用
    这篇文章给大家分享的是有关Java中单例模式怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。注意单例类只能有一个实例。单例类必须自己创建自己的唯一实例。单例类必须给所有其他对象提供这一实例。优点在内存里只有一...
    99+
    2023-06-29
  • php单例模式怎么正确使用
    正确使用 PHP 单例模式的步骤如下:1. 创建一个类,将其构造函数设置为私有,以防止通过 `new` 关键字创建对象。2. 在类中...
    99+
    2023-09-13
    php
  • php单例模式怎么实现
    PHP单例模式可以通过以下步骤实现:1. 创建一个类,并将构造函数设为私有,以防止外部直接实例化该类。2. 在类内部创建一个静态私有...
    99+
    2023-09-29
    php
  • Java单例模式与破坏单例模式的概念是什么
    本文小编为大家详细介绍“Java单例模式与破坏单例模式的概念是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java单例模式与破坏单例模式的概念是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。什么是单例...
    99+
    2023-07-05
  • web中怎么使用单例模式
    这篇文章主要为大家展示了“web中怎么使用单例模式”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“web中怎么使用单例模式”这篇文章吧。介绍单例模式,顾名思义就是...
    99+
    2024-04-02
  • 怎么在JavaScript中应用单例模式
    这篇文章将为大家详细讲解有关怎么在JavaScript中应用单例模式,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。javascript是一种什么语言javascript是一种动态类型、弱类型...
    99+
    2023-06-14
  • java单例模式有哪些
    java中的单例模式有:1.懒汉式单例;2.饿汉式单例;3.登记式单例;java中的单例模式有以下几种懒汉式单例java中懒汉式单例是指单例类在第一次调用时进行实例化,不存在多线程同步问题,可以避免synchronized所造成的性能问题。...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作