百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

PHP面试,从单例模式的两种实现形式讲起

haoteby 2025-01-26 22:26 5 浏览

我们在面试过程中经常碰到的一道笔试题就是手写单例(singleton)模式,本文详细讲解了单例模式的两种实现形式。

单例(singleton)模式,当你实例化一个对象时,它可以确保你实例化的这个类将仅有一个实例。

当你使用单例模式第一次调用对象时,它就会被实例化,之后每一次调用都将返回同一个对象。单例模式代表在应用程序不同部分被再三使用的资源。其中常见的示例包括数据库连接和配置信息。

单例最重要的方面在于对创建实例的限制能力。如果不这样做,潜在的多个实例将被创建。

单例模式实现方式1:

class Database
{
    private static $instance = null;

    private function __construct()
    {
    }

    public static function getInstance()
    {
        if (!(self::$instance instanceof Database)) {
            self::$instance = new Database();
        }

        return self::$instance;
    }
}

实现单例有 3 个关键点:

  1. 使用一个静态成员来保持一个单例实例,在这个例子中,我们有一个私有的 Database::$instance 属性。
  2. 一个私有的__construct()将决定这个类只能被本身所包含的静态方法实例化。
  3. Database::getInstance()静态方法将用于数据库类。当它被调用时,DB::getInstance() 将实例化一个 Database 类的对象并将这个对象指定给 Database:$instance 属性,然后返回这个对象,或只是返回先前实例化的对象。

我们之所以使用单例模式,是因为静态方法可以在全局范围内被访问,无论哪里,当我们需要一个数据库连接时,只需调用 Database::getinstance() 即可。

自 PHP 5.4.0 起,PHP 实现了一种代码复用的方法,称为 trait。

Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制。Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用 method。Trait 和 Class 组合的语义定义了一种减少复杂性的方式,避免传统多继承和 Mixin 类相关典型问题。

单例模式实现方式2:

trait Singleton
{
    static $instance = null;

    public static function getInstance()
    {
        $class = __CLASS__;
        if (!(self::$instance instanceof _CLASS_)) {
            self::$instance = new $class();
        }

        return self::$instance;
    }
}

class DB
{
    use Singleton;

    private function __construct()
    {
    }
}

相关推荐

前端:从零实现一款可视化图片编辑器

背景介绍我们知道,为了提高企业研发效能和对客户需求的快速响应,现在很多企业都在着手数字化转型,不仅仅是大厂(阿里,字节,腾讯,百度)在做低代码可视化这一块,很多中小企业也在做,拥有可视化低代码相关技术...

2018年面世 英特尔将打造超级计算机

|责编:王冬奇中关村在线消息:据国外媒体报道,近日英特尔宣布将联手Cray公司为美国阿贡国家实验室打造一台性能强大的全新超级计算机——极光(Aurora),运算性能可达到180P-Flops(每秒浮...

Hyperledger Fabric 2.0安装教程

本文介绍如何安装最新的HyperledgerFabric2.0的预编译程序、fabric-samples示例配置和代码以及docker镜像。HyperledgerFabric区块链开发教程:F...

一文精通虚拟端口通道vPC,精品文章,爱了

今天给大家带来的是虚拟端口通道相关的技术:简介...

「数据中心」数据中心脊页架构:思科FabricPath Spine和Leaf网络

思科在2010年引入了FabricPath技术。FabricPath提供了新的功能和设计选项,使网络运营商能够创建以太网结构,从而提高带宽可用性,提供设计灵活性,并简化和降低网络和应用程序部署和操作的...

51单片机项目:定时宠物喂食系统(含代码)keil、DXP原理图

题目要求:一、拟解决的主要问题...

基于51单片机的多功能智能语音循迹避障小车(含代码)

大家好,今天给大家介绍基于51单片机的多功能智能语音循迹避障小车,下方附有本文涉及的全部资料和源代码的获取方式,可进群免费领取。一.功能介绍及硬件准备这是一款基于51单片机开发的智能小车,通过这篇文章...

如何对自己尚不熟悉Angular.js的情况下对代码进行调试

【51CTO.com快译】如果大家对AngularJS还不熟悉,那么可能会在初步创建Web应用时对很多问题感到担心。而且尽管这可能已经是我们所能用到的上手难度最低的Web开发框架之一,但大家仍然需要了...

拿代码量算KPI跟程序员们来这套?(下)

嘿嘿,一个美丽的周末又这么过来了~小伙伴们都做了些啥呢?加班了咩?改bug了咩?催需求了咩?小编也如约更新“拿代码量算KPI……跟程序员们来这套?(下)”前情回顾请点击下方菜单栏的“精彩文章”,找到7...

哆啦A梦彩色版第5卷第51章,胖虎的料理

重温童年经典动漫,哆啦A梦彩色版第5卷第51章,胖虎的料理...

51单片机项目设计:基于51单片机时钟万年历(含代码、原理图)

大家好,今天给大家介绍基于单片机stm32的多功能氛围灯、手机控制ws2812和MCU升级程序,文章末尾附有本毕业设计的论文和源码的获取方式,也可现在直接进群免费领取。...

重构代码,真没有银弹

译者|布加迪我的一位同事在大型项目代码重构方面有丰富的经验,他真诚地与我分享了他如何处理这些繁杂的任务。虽然他做的大部分事情只是坚持不懈地努力,就像在健身房锻炼那样,但这对我来说很有意义。本文分享...

51&52单片机C语言程序实例Proteus仿真和代码300个

11个奇奇怪怪的微信隐藏玩法(含撩妹教程)

最近,我在微信发现了一个好玩的东西用它可以扒到好友的“黑料”...

程序员没转发公司朋友圈,被罚款500,半个月后3行代码让领导懵了

现在在职场,也确实存在着许多的身不由己,很多事情都不是自己想做的,但是为了工作也不得不做。就比如说公司经常会要求员工们发一些朋友圈,很多人都不愿意把工作上的东西发到朋友圈去,但是如果不发又要挨领导的批...