php单例模式

2019-08-28 09:23:15

什么是单例模式#

单例模式,是一种常见的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。

单例模式的优点#

  • 减少频繁创建,节省了cpu。

  • 静态对象公用,节省了内存。

  • 功能解耦,代码已维护。

单例模式的应用#

实际项目中像数据库查询,日志输出,全局回调,统一校验等模块。这些模块功能单一,但是需要多次访问,如果能够全局唯一,多次复用会大大提升性能。这也是单例存在的必要性。

如何设计单例模式#

通过上面的描述,单例的核心是,实例一次生成,全局唯一,多次调用。因此在单例模式必须包含三要素。

  1. 私有化构造函数,私有化clone。也就是不能new,不能clone【唯一】

  2. 拥有一个静态变量,用于保存当前的类。【唯一如何保存】

  3. 提供一个公共的访问入口。【可以访问】

PHP实现#

复制代码

class Singleton
{    // 私有化构造方法
    private function __construct()
    {

    }    
    // 私有化clone方法
    private function __clone()
    {
    
    }    // 保存实例的静态对象
    public static $singleInstance;    /**
     * 声明静态调用方法
     * 目的:保证该方法的调用全局唯一
     *
     * @return  Singleton     */
    public static function getInstance()
    {        if (!self::$singleInstance) {
            self::$singleInstance = new self();
        }        return self::$singleInstance;
    }    // 调用单例的方法
    public function singletonFunc()
    {        echo "call single ton method";
    }

}$singleInstance =  Singleton::getInstance();$singleInstance->singletonFunc();$singleInstance2 =  Singleton::getInstance();$singleInstance2->singletonFunc();// 校验是否是一个实例var_dump($singleInstance === $singleInstance2);  // true ,一个对象

复制代码

php中static属性和方法的继承问题(补充知识)#

复制代码

class Base
{    public static $var = 'var';    public static function testStaticFun()
    {        echo 'func';
    }
}class A extends Base
{    public function testSelf()
    {        echo self::$var;
    }    public function testParent()
    {        echo parent::$var;
    }    public function setSelf()
    {
        self::$var = 'self';
    }    public function setParent()
    {
        parent::$var = 'parent';
    }    public static function testStaticFun()
    {
        parent::testStaticFun();        echo 'over';
    }
}$objA = new A();     
  
$objA->testSelf();    // var$objA->testParent();  // var$objA->setSelf();$objA->testSelf();    // self$objA->testParent();  // selfecho Base::$var;      // self$objA->setParent();$objA->testSelf();    // parent$objA->testParent();  // parentecho Base::$var;      // parentBase::testStaticFun();    // funcA::testStaticFun();       // func over

复制代码

 

  1. 静态成员可以使用 访问控制关键字修饰,可以被继承和重写
    也就就说子类可以继承到父类的静态变量、方法…遵循“关键字”规则

  2. 如果子类没有重写,那么子类调用的实际是父类的静态方法
    这个也很简单明了,继承的基本规则,没什么好解释的

  3. 静态成员持有者是类不是对象,所以类的多个实例共享同一个静态属性的,在一个实例中修改静态属性会影响到另一个实例中的静态属性。
    这个就是重点了,好好理解下,单列模式也是利用这个特性。

所以代码中 self::$var 和 parent::$var 其实指向的都是父类中的$var
最后举个栗子:
单例模式下,$var你可以理解为数据库连接,父类生成一个连接后,继承的子类直接使用这个连接即可连接使用数据库。
但是如果子类自己生成一个连接$var,那么使用的时候就要区分是self::$var还是parent::$var,因为俩个值可能不一样,连接的数据库也不一样,万一是主从呢。


  • 2020-03-16 15:57:53

    nuxtjs中单独引入Message组件的问题

    // 引入elementUIimport { Message } from 'element-ui';//由于Message组件并没有install 方法供Vue来操作的,是直接返回的,因此按照官方文档单独引入的方法是//会报错的,需要给 Message 添加 install 方法Message.install = function (Vue, options) {Vue.prototype.$message = Message}Vue.use(Message )//消息提示

  • 2020-03-16 16:03:20

    css的var()函数

     随着sass,less预编译的流行,css也随即推出了变量定义var函数。var()函数,就如同sass和less等预编译软件一样,可以定义变量并且进行对应的使用。

  • 2020-03-16 16:52:05

    对icomoon的误解,以及最快速的使用

    此时需要注意顶部第一个选项,Quick Usage,一定要打开,Enable Quick Usage,谁让咱英语不好呢,这个时候会出现一个css连接,直接引用就好了,就可以随意使用图标了,引入这一个css就能实现我们的功能,省区引入太多文件的烦恼,你可以在浏览器打开这个css,可以看到里面把我们所用的文件整成base64了。所以挺好用的。

  • 2020-03-17 09:47:05

    video标签视频不自动播放的问题

    添加 muted 属性,就可以通过地址栏进入网页的时候自动播放了,手机端还是有的有限制的,比如iphone浏览器,就不行,苹果手机为了保护用户的流量和用户的意愿,是禁止自动播放的,必须有手动触发。

  • 2020-03-17 14:21:31

    nuxt+pm2 自动化部署及打包后文件自动上传阿里云 oss(精华)

    部署nuxtjs,这一篇文章就够了,pm2 代码自动发布依赖于 git 工具,先将 ssh 密钥配置再你的代码仓库(github 或者 gitLab),具体操作自行 google 或者点击github 配置 ssh。 使用 ssh 密钥链接服务器 s $ ssh-copy-id root@1.2.3.4 # 把本机的 SSH 秘钥添加至服务器,配置成功后,以后就不需要再执行这条 SSH 命令了

  • 2020-03-18 21:15:34

    使用canvas画布解决百度地图自定义图层全球连续显示问题

        基于百度地图的Web API进行自定义图层叠加时,默认的图层只能叠加到全球范围以内,即经度范围为[-180, 180],而无法将图层叠加到默认的全球范围以外,即经度范围超出了[-180, 180]之后,经纬度坐标会自动回归到(0, 0),而导致在地图拖拽时全球以外无法连续显示想要的图层,此时可以基于百度地图的自定义图层将经纬度坐标转为像素点使用画布canvas来解决该问题。解决后效果如下图所示: ———————————————— 版权声明:本文为CSDN博主「宏伟杰作」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/u011284073/article/details/80549950

  • 2020-03-18 21:18:01

    node-canvas实现百度地图个性化底图绘制

    随着nodejs的推出,node的并发和异步的强大能力,越来越多的得到应用,而且取得了非常不错的效果。 作为一个前端工程师对node.js自然有着一份更深的感情,跃跃欲试的心情,总希望能将它应用到产品中来。